1pub use crate::mimepart::PartRef;
2use config::{SerdeWrappedValue, any_err, get_or_create_sub_module};
3use mailparsing::{AttachmentOptions, MimePart, SharedString};
4use mlua::{Lua, UserDataRef};
5
6pub mod builder;
7pub mod headers;
8pub mod mimepart;
9
10fn new_text_part(
11 _: &Lua,
12 (content_type, content): (String, mlua::String),
13) -> mlua::Result<PartRef> {
14 let part = MimePart::new_text(&content_type, content.as_bytes().as_ref()).map_err(any_err)?;
15 Ok(PartRef::new(part))
16}
17
18fn new_text_plain(_: &Lua, content: mlua::String) -> mlua::Result<PartRef> {
19 let part = MimePart::new_text_plain(content.as_bytes().as_ref()).map_err(any_err)?;
20 Ok(PartRef::new(part))
21}
22
23fn new_html(_: &Lua, content: mlua::String) -> mlua::Result<PartRef> {
24 let part = MimePart::new_html(content.as_bytes().as_ref()).map_err(any_err)?;
25 Ok(PartRef::new(part))
26}
27
28fn new_binary(
29 _: &Lua,
30 (content_type, content, options): (
31 String,
32 mlua::String,
33 Option<SerdeWrappedValue<AttachmentOptions>>,
34 ),
35) -> mlua::Result<PartRef> {
36 let part = MimePart::new_binary(
37 &content_type,
38 content.as_bytes().as_ref(),
39 options.as_deref(),
40 )
41 .map_err(any_err)?;
42 Ok(PartRef::new(part))
43}
44
45fn new_multipart(
46 _: &Lua,
47 (content_type, parts, boundary): (String, Vec<UserDataRef<PartRef>>, Option<String>),
48) -> mlua::Result<PartRef> {
49 let mut child_parts = vec![];
50 for p in parts {
51 child_parts.push(p.resolve().map_err(any_err)?.to_owned());
52 }
53
54 let part = MimePart::new_multipart(
55 &content_type,
56 child_parts,
57 boundary.as_ref().map(|s| s.as_bytes()),
58 )
59 .map_err(any_err)?;
60 Ok(PartRef::new(part))
61}
62
63fn parse_eml(_: &Lua, eml_contents: String) -> mlua::Result<PartRef> {
64 let eml_contents: SharedString = eml_contents.into();
65 let part = MimePart::parse(eml_contents).map_err(any_err)?;
66 Ok(PartRef::new(part))
67}
68
69pub fn register(lua: &Lua) -> anyhow::Result<()> {
70 let kumo_mod = get_or_create_sub_module(lua, "mimepart")?;
71 kumo_mod.set("parse", lua.create_function(parse_eml)?)?;
72 kumo_mod.set("new_binary", lua.create_function(new_binary)?)?;
73 kumo_mod.set("new_html", lua.create_function(new_html)?)?;
74 kumo_mod.set("new_multipart", lua.create_function(new_multipart)?)?;
75 kumo_mod.set("new_text", lua.create_function(new_text_part)?)?;
76 kumo_mod.set("new_text_plain", lua.create_function(new_text_plain)?)?;
77 kumo_mod.set(
78 "builder",
79 lua.create_function(|_lua, ()| Ok(crate::builder::Builder::new()))?,
80 )?;
81 Ok(())
82}