mod_mimepart/
lib.rs

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}