use super::types::{Resource, ResourceContents, ResourceTemplate};
use crate::mcp::{Cursor, GenericMeta, IntoMcpRequest, PaginationParams, RequestMeta};
use serde::{Deserialize, Serialize};
use serde_with::skip_serializing_none;
#[skip_serializing_none]
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
#[serde(rename_all = "camelCase")]
pub struct ListResourcesParams {
#[serde(rename = "_meta")]
pub meta: Option<RequestMeta>,
#[serde(flatten)]
pub pagination: PaginationParams,
}
impl ListResourcesParams {
pub fn new() -> Self {
Self::default()
}
pub fn with_meta(mut self, meta: RequestMeta) -> Self {
self.meta = Some(meta);
self
}
pub fn with_pagination(mut self, pagination: PaginationParams) -> Self {
self.pagination = pagination;
self
}
pub fn with_cursor(mut self, cursor: impl Into<Cursor>) -> Self {
self.pagination.cursor = Some(cursor.into());
self
}
}
impl IntoMcpRequest<ListResourcesParams> for ListResourcesParams {
const METHOD: &'static str = "resources/list";
type McpResult = ListResourcesResult;
}
#[skip_serializing_none]
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ListResourcesResult {
#[serde(rename = "_meta")]
pub meta: Option<GenericMeta>,
pub next_cursor: Option<Cursor>,
pub resources: Vec<Resource>,
}
#[skip_serializing_none]
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
#[serde(rename_all = "camelCase")]
pub struct ListResourceTemplatesParams {
#[serde(rename = "_meta")]
pub meta: Option<RequestMeta>,
#[serde(flatten)]
pub pagination: PaginationParams,
}
impl ListResourceTemplatesParams {
pub fn new() -> Self {
Self::default()
}
pub fn with_meta(mut self, meta: RequestMeta) -> Self {
self.meta = Some(meta);
self
}
pub fn with_pagination(mut self, pagination: PaginationParams) -> Self {
self.pagination = pagination;
self
}
pub fn with_cursor(mut self, cursor: impl Into<Cursor>) -> Self {
self.pagination.cursor = Some(cursor.into());
self
}
}
impl IntoMcpRequest<ListResourceTemplatesParams> for ListResourceTemplatesParams {
const METHOD: &'static str = "resources/templates/list";
type McpResult = ListResourceTemplatesResult;
}
#[skip_serializing_none]
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ListResourceTemplatesResult {
#[serde(rename = "_meta")]
pub meta: Option<GenericMeta>,
pub next_cursor: Option<Cursor>,
pub resource_templates: Vec<ResourceTemplate>,
}
#[skip_serializing_none]
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ReadResourceParams {
#[serde(rename = "_meta")]
pub meta: Option<RequestMeta>,
pub uri: String,
}
impl ReadResourceParams {
pub fn new(uri: impl Into<String>) -> Self {
Self {
meta: None,
uri: uri.into(),
}
}
pub fn with_meta(mut self, meta: RequestMeta) -> Self {
self.meta = Some(meta);
self
}
}
impl IntoMcpRequest<ReadResourceParams> for ReadResourceParams {
const METHOD: &'static str = "resources/read";
type McpResult = ReadResourceResult;
}
#[skip_serializing_none]
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ReadResourceResult {
#[serde(rename = "_meta")]
pub meta: Option<GenericMeta>,
pub contents: Vec<ResourceContents>,
}
#[skip_serializing_none]
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct SubscribeParams {
#[serde(rename = "_meta")]
pub meta: Option<RequestMeta>,
pub uri: String,
}
impl SubscribeParams {
pub fn new(uri: impl Into<String>) -> Self {
Self {
meta: None,
uri: uri.into(),
}
}
pub fn with_meta(mut self, meta: RequestMeta) -> Self {
self.meta = Some(meta);
self
}
}
impl IntoMcpRequest<SubscribeParams> for SubscribeParams {
const METHOD: &'static str = "resources/subscribe";
type McpResult = ();
}
#[skip_serializing_none]
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct UnsubscribeParams {
#[serde(rename = "_meta")]
pub meta: Option<RequestMeta>,
pub uri: String,
}
impl UnsubscribeParams {
pub fn new(uri: impl Into<String>) -> Self {
Self {
meta: None,
uri: uri.into(),
}
}
pub fn with_meta(mut self, meta: RequestMeta) -> Self {
self.meta = Some(meta);
self
}
}
impl IntoMcpRequest<UnsubscribeParams> for UnsubscribeParams {
const METHOD: &'static str = "resources/unsubscribe";
type McpResult = ();
}