diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 79f0bc126..ab2c2380a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -70,6 +70,14 @@ jobs: | select(. != "local")] | join(",")') cargo clippy --package rmcp --all-targets --no-default-features --features "$FEATURES" -- -D warnings + # Only --lib: some tests don't build in reduced feature sets. + - name: Run clippy (reduced feature sets) + run: | + cargo clippy --package rmcp --lib -- -D warnings + cargo clippy --package rmcp --lib --no-default-features -- -D warnings + cargo clippy --package rmcp --lib --no-default-features --features client -- -D warnings + cargo clippy --package rmcp --lib --no-default-features --features server -- -D warnings + semver: name: SemVer Check runs-on: ubuntu-latest diff --git a/crates/rmcp/src/model.rs b/crates/rmcp/src/model.rs index 275d86dd5..f476148a0 100644 --- a/crates/rmcp/src/model.rs +++ b/crates/rmcp/src/model.rs @@ -3,10 +3,8 @@ #![expect(deprecated)] use std::{ borrow::Cow, - collections::hash_map::RandomState, - hash::{BuildHasher, Hasher}, ops::{Deref, DerefMut}, - sync::{Arc, OnceLock}, + sync::Arc, }; mod annotated; mod capabilities; @@ -318,6 +316,7 @@ impl NumberOrString { } } + #[cfg(any(feature = "client", feature = "server"))] pub(crate) fn numeric_string_value(&self) -> Option { match self { Self::String(id) => id.parse().ok(), @@ -325,6 +324,7 @@ impl NumberOrString { } } + #[cfg(feature = "client")] pub(crate) fn matches_response_id(&self, response_id: &Self) -> bool { self == response_id || matches!( @@ -653,6 +653,7 @@ pub struct ErrorData { } impl ErrorData { + #[cfg(any(feature = "client", feature = "server"))] const TRANSPORT_CLOSED_MARKER: &str = "io.modelcontextprotocol/transportClosed"; pub fn new( @@ -714,7 +715,10 @@ impl ErrorData { Self::new(ErrorCode::INTERNAL_ERROR, message, data) } - #[cfg(feature = "transport-streamable-http-client")] + #[cfg(all( + feature = "transport-streamable-http-client", + any(feature = "client", feature = "server") + ))] pub(crate) fn transport_closed(message: impl Into>) -> Self { let mut data = JsonObject::new(); data.insert( @@ -724,6 +728,7 @@ impl ErrorData { Self::internal_error(message, Some(Value::Object(data))) } + #[cfg(any(feature = "client", feature = "server"))] pub(crate) fn is_transport_closed(&self) -> bool { self.data .as_ref() @@ -732,7 +737,14 @@ impl ErrorData { == Some(Self::transport_closed_token()) } + #[cfg(any(feature = "client", feature = "server"))] fn transport_closed_token() -> u64 { + use std::{ + collections::hash_map::RandomState, + hash::{BuildHasher, Hasher}, + sync::OnceLock, + }; + static TOKEN: OnceLock = OnceLock::new(); *TOKEN.get_or_init(|| { let mut hasher = RandomState::new().build_hasher(); @@ -4961,7 +4973,10 @@ mod tests { assert!(ProtocolVersion::known_up_to(&ancient).is_empty()); } - #[cfg(feature = "transport-streamable-http-client")] + #[cfg(all( + feature = "transport-streamable-http-client", + any(feature = "client", feature = "server") + ))] #[test] fn transport_closed_marker_accepts_only_the_process_local_token() { let local = ErrorData::transport_closed("closed"); diff --git a/crates/rmcp/src/service.rs b/crates/rmcp/src/service.rs index 8fcf9b41b..6b01cfd58 100644 --- a/crates/rmcp/src/service.rs +++ b/crates/rmcp/src/service.rs @@ -1035,16 +1035,19 @@ impl Peer { *self.info.write().expect("peer info lock poisoned") = Some(Arc::new(info)); } + #[cfg(feature = "client")] pub(crate) fn set_client_request_metadata(&self, metadata: ClientRequestMetadata) { let result = self.client_request_metadata.set(metadata); debug_assert!(result.is_ok(), "client request metadata set more than once"); } + #[cfg(feature = "server")] pub(crate) fn require_request_metadata(&self) { self.request_metadata_required .store(true, std::sync::atomic::Ordering::Release); } + #[cfg(feature = "server")] pub(crate) fn request_metadata_required(&self) -> bool { self.request_metadata_required .load(std::sync::atomic::Ordering::Acquire) diff --git a/crates/rmcp/src/transport.rs b/crates/rmcp/src/transport.rs index fdedc9c3a..4af10ce64 100644 --- a/crates/rmcp/src/transport.rs +++ b/crates/rmcp/src/transport.rs @@ -272,6 +272,7 @@ impl DynamicTransportError { } } + #[cfg(feature = "client")] pub(crate) fn is_authorization_required(&self) -> bool { let mut error = Some(self.error.as_ref() as &(dyn std::error::Error + 'static)); while let Some(current) = error {