turul_mcp_builders/traits/
completion_traits.rs

1//! Framework traits for MCP completion construction
2//!
3//! **IMPORTANT**: These are framework features, NOT part of the MCP specification.
4
5use turul_mcp_protocol::completion::{
6    CompleteArgument, CompleteRequest, CompletionContext, CompletionReference,
7};
8
9/// Trait for completion metadata (method, reference)
10pub trait HasCompletionMetadata {
11    /// The completion method name
12    fn method(&self) -> &str;
13
14    /// The reference being completed (prompt or resource)
15    fn reference(&self) -> &CompletionReference;
16}
17
18/// Trait for completion context (argument, context)
19pub trait HasCompletionContext {
20    /// The argument being completed
21    fn argument(&self) -> &CompleteArgument;
22
23    /// Optional completion context
24    fn context(&self) -> Option<&CompletionContext> {
25        None
26    }
27}
28
29/// Trait for completion validation and processing
30pub trait HasCompletionHandling {
31    /// Validate the completion request
32    fn validate_request(&self, _request: &CompleteRequest) -> Result<(), String> {
33        Ok(())
34    }
35
36    /// Filter completion values based on current input
37    fn filter_completions(&self, values: Vec<String>, current_value: &str) -> Vec<String> {
38        // Default: simple prefix matching
39        values
40            .into_iter()
41            .filter(|v| v.to_lowercase().starts_with(&current_value.to_lowercase()))
42            .collect()
43    }
44}
45
46/// Complete MCP Completion Definition trait
47///
48/// This trait represents a complete, working MCP completion provider.
49/// When you implement the required traits, you automatically get
50/// `CompletionDefinition` for free via blanket implementation.
51pub trait CompletionDefinition:
52    HasCompletionMetadata + HasCompletionContext + HasCompletionHandling
53{
54    /// Convert this completion definition to a protocol CompleteRequest
55    fn to_complete_request(&self) -> CompleteRequest {
56        let mut request = CompleteRequest::new(self.reference().clone(), self.argument().clone());
57        if let Some(context) = self.context() {
58            request = request.with_context(context.clone());
59        }
60        request
61    }
62}
63
64// Blanket implementation: any type implementing the fine-grained traits automatically gets CompletionDefinition
65impl<T> CompletionDefinition for T where
66    T: HasCompletionMetadata + HasCompletionContext + HasCompletionHandling
67{
68}