use std::sync::Arc;
use crate::plugin::{Context, ExecPlugin, Plugin};
use crate::{RegisterExecPlugin, Result};
use async_trait::async_trait;
#[derive(Debug, Default, RegisterExecPlugin)]
pub struct DropRespPlugin;
impl DropRespPlugin {
pub fn new() -> Self {
Self
}
}
#[async_trait]
impl Plugin for DropRespPlugin {
fn name(&self) -> &str {
"drop_resp"
}
async fn execute(&self, ctx: &mut Context) -> Result<()> {
ctx.set_response(None);
Ok(())
}
fn init(_config: &crate::config::types::PluginConfig) -> Result<Arc<dyn Plugin>> {
Ok(Arc::new(DropRespPlugin::new()))
}
}
impl ExecPlugin for DropRespPlugin {
fn quick_setup(prefix: &str, _exec_str: &str) -> Result<Arc<dyn Plugin>> {
if prefix != "drop_resp" {
return Err(crate::Error::Config(format!(
"ExecPlugin quick_setup: unsupported prefix '{}', expected 'drop_resp'",
prefix
)));
}
Ok(Arc::new(DropRespPlugin::new()))
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::dns::Message;
#[tokio::test]
async fn test_drop_resp() {
let plugin = DropRespPlugin;
let req = Message::new();
let mut ctx = Context::new(req);
ctx.set_response(Some(Message::new()));
plugin.execute(&mut ctx).await.unwrap();
assert!(!ctx.has_response());
}
#[test]
fn test_exec_plugin_quick_setup() {
let plugin = <DropRespPlugin as ExecPlugin>::quick_setup("drop_resp", "").unwrap();
assert_eq!(plugin.name(), "drop_resp");
let plugin = <DropRespPlugin as ExecPlugin>::quick_setup("drop_resp", "ignored").unwrap();
assert_eq!(plugin.name(), "drop_resp");
let result = <DropRespPlugin as ExecPlugin>::quick_setup("invalid", "");
assert!(result.is_err());
}
}