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