mod_mimepart/
lib.rs

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}