use crate::api::{EngineResult, SharedObject};
use anyhow::Context;
use rhai::plugin::{
mem, Dynamic, FnAccess, FnNamespace, ImmutableString, Module, NativeCallContext,
PluginFunction, RhaiResult, TypeId,
};
pub use dns::*;
use super::Server;
#[rhai::plugin::export_module]
mod dns {
use crate::get_global;
#[rhai_fn(name = "lookup", return_raw)]
pub fn lookup(ncc: NativeCallContext, name: &str) -> EngineResult<rhai::Array> {
super::Impl::lookup(&get_global!(ncc, srv), name)
}
#[doc(hidden)]
#[rhai_fn(name = "lookup", return_raw)]
pub fn lookup_obj(ncc: NativeCallContext, name: SharedObject) -> EngineResult<rhai::Array> {
super::lookup(ncc, &name.to_string())
}
#[rhai_fn(name = "rlookup", return_raw)]
pub fn rlookup(ncc: NativeCallContext, name: &str) -> EngineResult<rhai::Array> {
super::Impl::rlookup(&get_global!(ncc, srv), name)
}
#[doc(hidden)]
#[rhai_fn(name = "rlookup", return_raw)]
pub fn rlookup_obj(ncc: NativeCallContext, name: SharedObject) -> EngineResult<rhai::Array> {
super::rlookup(ncc, &name.to_string())
}
}
struct Impl;
impl Impl {
fn lookup(server: &Server, host: &str) -> EngineResult<rhai::Array> {
let resolver = server.resolvers.get_resolver_root();
Ok(block_on!(resolver.lookup_ip(host))
.map_err::<Box<rhai::EvalAltResult>, _>(|err| err.to_string().into())?
.into_iter()
.map(|record| rhai::Dynamic::from(record.to_string()))
.collect::<rhai::Array>())
}
fn rlookup(server: &Server, ip: &str) -> EngineResult<rhai::Array> {
let ip = vsl_conversion_ok!(
"ip address",
<std::net::IpAddr as std::str::FromStr>::from_str(ip)
.context("fail to parse ip address in rlookup")
);
let resolver = server.resolvers.get_resolver_root();
Ok(block_on!(resolver.reverse_lookup(ip))
.map_err::<Box<rhai::EvalAltResult>, _>(|err| err.to_string().into())?
.into_iter()
.map(|record| rhai::Dynamic::from(record.to_string()))
.collect::<rhai::Array>())
}
}