pub mod scanresult;
use crate::{
actors::scanmgr::{error::Error, messages::InvokeScan, ScanMgr},
userscript_api::{
include::{Lua, LuaExternalError, LuaTable, LuaUserDataRef},
scanmgr_api::scanresult::{add_csv_method, ScanResult},
ApiObject,
},
};
use kameo::actor::WeakActorRef;
use mlua::UserData;
use scanresult::{add_json_method, add_ndjson_method};
pub struct ScanMgrApi(WeakActorRef<ScanMgr>);
impl ScanMgrApi {
#[must_use]
pub fn new(scanmgr: WeakActorRef<ScanMgr>) -> Self {
Self(scanmgr)
}
}
impl UserData for ScanMgrApi {
fn add_methods<M: mlua::UserDataMethods<Self>>(methods: &mut M) {
methods.add_async_method(
"scan",
|lua: Lua, this: LuaUserDataRef<ScanMgrApi>, ()| async move {
let Some(scanmgr) = this.0.upgrade() else {
return Err(Error::NoScanMgr.into_lua_err());
};
let raw_results: Vec<ScanResult> = scanmgr
.ask(InvokeScan)
.await
.map_err(LuaExternalError::into_lua_err)?;
let results_table: LuaTable = lua.create_table()?;
for result in raw_results {
results_table.push(result)?;
}
add_csv_method(&lua, &results_table).await?;
add_json_method(&lua, &results_table).await?;
add_ndjson_method(&lua, &results_table).await?;
Ok(results_table)
},
);
}
}
impl ApiObject for ScanMgrApi {
fn name(&self) -> &'static str {
"scanmgr"
}
}