use std::future::Future;
use std::pin::Pin;
pub type OperationDispatchFuture<RootError> =
Pin<Box<dyn Future<Output = Result<serde_json::Value, RootError>> + Send>>;
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum RequestOperationKind {
Query,
Mutation,
}
pub struct RequestOperationDescriptor<Context, RootError> {
pub domain: &'static str,
pub operation: &'static str,
pub qualified_operation: &'static str,
pub canonical_variant: &'static str,
pub kind: RequestOperationKind,
pub mcp_eligible: bool,
pub input_type: &'static str,
pub response_type: &'static str,
pub response_variant: &'static str,
pub input_schema: fn() -> schemars::Schema,
pub output_schema: fn() -> schemars::Schema,
pub dispatch: fn(Context, serde_json::Value) -> OperationDispatchFuture<RootError>,
}
pub struct DomainPublication<Context: 'static, RootError: 'static> {
pub server_name: &'static str,
pub route_slug: &'static str,
pub operations: &'static [RequestOperationDescriptor<Context, RootError>],
}
#[cfg(test)]
mod tests {
use super::{OperationDispatchFuture, RequestOperationDescriptor, RequestOperationKind};
fn accepts_generic_descriptor<Context, RootError>(_descriptor: RequestOperationDescriptor<Context, RootError>) {}
fn dispatch(_: (), _: serde_json::Value) -> OperationDispatchFuture<std::io::Error> {
Box::pin(async { Err(std::io::Error::other("test")) })
}
#[test]
fn publication_contract_accepts_embedding_context_and_root_error() {
accepts_generic_descriptor(RequestOperationDescriptor {
domain: "test",
operation: "read",
qualified_operation: "test.read",
canonical_variant: "TestRequest::Read",
kind: RequestOperationKind::Query,
mcp_eligible: true,
input_type: "ReadInput",
response_type: "ReadOutput",
response_variant: "Read",
input_schema: schemars::Schema::default,
output_schema: schemars::Schema::default,
dispatch,
});
}
}