use std::sync::Arc;
use rmcp::model::{ElicitRequestParams, ElicitResult, ElicitationAction};
#[async_trait::async_trait]
pub trait ElicitationDelegate: Send + Sync + std::fmt::Debug {
async fn elicit(&self, params: ElicitRequestParams) -> ElicitResult;
}
pub type SharedElicitationDelegate = Arc<dyn ElicitationDelegate>;
pub async fn handle_elicitation(
delegate: Option<&SharedElicitationDelegate>,
params: ElicitRequestParams,
) -> ElicitResult {
if let Some(delegate) = delegate {
delegate.elicit(params).await
} else {
tracing::warn!(
mode = params_mode(¶ms),
"Elicitation request received with no delegate installed; declining"
);
ElicitResult::new(ElicitationAction::Decline)
}
}
const fn params_mode(params: &ElicitRequestParams) -> &'static str {
match params {
ElicitRequestParams::FormElicitationParams { .. } => "form",
ElicitRequestParams::UrlElicitationParams { .. } => "url",
_ => "unknown",
}
}