use vsmtp_common::status::SmtpConnection;
use rhai::plugin::{
mem, Dynamic, FnAccess, FnNamespace, NativeCallContext, PluginFunction, RhaiResult, TypeId,
};
use rhai::Module;
#[derive(Debug, serde::Deserialize)]
struct SmtpDelegatorParameters {
address: std::net::SocketAddr,
#[serde(default = "default_timeout", with = "humantime_serde")]
timeout: std::time::Duration,
}
#[derive(Debug, serde::Deserialize)]
struct SmtpParameters {
receiver: std::net::SocketAddr,
delegator: SmtpDelegatorParameters,
}
const fn default_timeout() -> std::time::Duration {
std::time::Duration::from_secs(30)
}
#[rhai::plugin::export_module]
pub mod smtp {
use crate::api::EngineResult;
type Smtp = rhai::Shared<crate::dsl::smtp::service::Smtp>;
#[rhai_fn(return_raw)]
pub fn connect(parameters: rhai::Map) -> EngineResult<Smtp> {
let parameters = rhai::serde::from_dynamic::<SmtpParameters>(¶meters.into())?;
Ok(rhai::Shared::new(crate::dsl::smtp::service::Smtp {
delegator: SmtpConnection(std::sync::Arc::new(std::sync::Mutex::new(
lettre::SmtpTransport::builder_dangerous(
parameters.delegator.address.ip().to_string(),
)
.port(parameters.delegator.address.port())
.timeout(Some(parameters.delegator.timeout))
.build(),
))),
receiver: parameters.receiver,
}))
}
}