use crate::logging::LogSender;
use crate::mrtr::ClientHandle;
use crate::progress::ProgressReporter;
use turbomcp_core::RequestContext;
macro_rules! plain_context {
($(#[$attr:meta])* $name:ident, $what:literal) => {
#[doc = concat!("Context for `", $what, "`.")]
$(#[$attr])*
#[derive(Debug, Clone)]
#[non_exhaustive]
pub struct $name {
/// Shared per-request metadata.
pub base: RequestContext,
}
impl $name {
#[must_use]
pub fn new(base: RequestContext) -> Self {
Self { base }
}
}
};
}
macro_rules! mrtr_context {
($(#[$attr:meta])* $name:ident, $what:literal) => {
#[doc = concat!("Context for `", $what, "` (MRTR-capable, SEP-2322).")]
$(#[$attr])*
#[derive(Debug, Clone)]
#[non_exhaustive]
pub struct $name {
/// Shared per-request metadata.
pub base: RequestContext,
pub client: ClientHandle,
pub progress: ProgressReporter,
pub log: LogSender,
}
impl $name {
#[must_use]
pub fn new(base: RequestContext) -> Self {
Self {
base,
client: ClientHandle::unavailable("no client channel attached"),
progress: ProgressReporter::disabled(),
log: LogSender::disabled(),
}
}
#[must_use]
pub(crate) fn with_client(mut self, client: ClientHandle) -> Self {
self.client = client;
self
}
#[must_use]
pub(crate) fn with_progress(mut self, progress: ProgressReporter) -> Self {
self.progress = progress;
self
}
#[must_use]
pub(crate) fn with_log(mut self, log: LogSender) -> Self {
self.log = log;
self
}
}
};
}
plain_context!(ListToolsContext, "tools/list");
mrtr_context!(CallToolContext, "tools/call");
plain_context!(ListResourcesContext, "resources/list");
plain_context!(ListResourceTemplatesContext, "resources/templates/list");
mrtr_context!(ReadResourceContext, "resources/read");
plain_context!(ListPromptsContext, "prompts/list");
mrtr_context!(GetPromptContext, "prompts/get");
plain_context!(CompleteContext, "completion/complete");