use crate::api::{Context, EngineResult, Message, Server};
use rhai::plugin::{
mem, Dynamic, EvalAltResult, FnAccess, FnNamespace, ImmutableString, Module, NativeCallContext,
PluginFunction, RhaiResult, TypeId,
};
pub use fs::*;
#[rhai::plugin::export_module]
mod fs {
use crate::get_global;
#[rhai_fn(name = "write", return_raw)]
pub fn write_str(ncc: NativeCallContext, dir: &str) -> EngineResult<()> {
super::write(
&get_global!(ncc, srv),
&get_global!(ncc, ctx),
&get_global!(ncc, msg),
dir,
)
}
#[rhai_fn(name = "dump", return_raw)]
pub fn dump_str(ncc: NativeCallContext, dir: &str) -> EngineResult<()> {
super::dump(&get_global!(ncc, srv), &get_global!(ncc, ctx), dir)
}
}
fn write(srv: &Server, ctx: &Context, message: &Message, dir: &str) -> EngineResult<()> {
let mut dir = srv.config.app.dirpath.join(dir);
std::fs::create_dir_all(&dir).map_err::<Box<EvalAltResult>, _>(|err| {
format!("cannot create folder '{}': {err}", dir.display()).into()
})?;
dir.push(format!(
"{}.eml",
vsl_guard_ok!(ctx.read())
.message_uuid()
.map_err(Into::<crate::error::RuntimeError>::into)?
));
let file = std::fs::OpenOptions::new()
.create(true)
.write(true)
.open(&dir)
.map_err::<Box<EvalAltResult>, _>(|err| {
format!("failed to write email at {}: {err}", dir.display()).into()
})?;
let mut writer = std::io::LineWriter::new(file);
let body = &message
.read()
.map_err::<Box<EvalAltResult>, _>(|e| e.to_string().into())?;
std::io::Write::write_all(&mut writer, body.inner().to_string().as_bytes())
.map_err(|err| format!("failed to write email at {dir:?}: {err}").into())
}
fn dump(srv: &Server, ctx: &Context, dir: &str) -> EngineResult<()> {
let mut dir = srv.config.app.dirpath.join(dir);
std::fs::create_dir_all(&dir).map_err::<Box<EvalAltResult>, _>(|err| {
format!("cannot create folder '{}': {err}", dir.display()).into()
})?;
dir.push(format!(
"{}.json",
vsl_guard_ok!(ctx.read())
.message_uuid()
.map_err(Into::<crate::error::RuntimeError>::into)?
));
let mut file = std::fs::OpenOptions::new()
.create(true)
.write(true)
.open(&dir)
.map_err::<Box<EvalAltResult>, _>(|err| {
format!("failed to dump email at {}: {err}", dir.display()).into()
})?;
std::io::Write::write_all(
&mut file,
serde_json::to_string_pretty(&*vsl_guard_ok!(ctx.read()))
.map_err::<Box<EvalAltResult>, _>(|err| {
format!("failed to dump email at {dir:?}: {err}").into()
})?
.as_bytes(),
)
.map_err(|err| format!("failed to dump email at {dir:?}: {err}").into())
}