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(
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}