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