use serde::Deserialize; use serde::Serialize; use std::fmt; /// Identifies a callable tool, preserving the namespace split when the model /// provides one. #[derive(Clone, Debug, Deserialize, Eq, Hash, PartialEq, Serialize)] pub struct ToolName { pub name: String, pub namespace: Option, } impl ToolName { pub fn new(namespace: Option, name: impl Into) -> Self { Self { name: name.into(), namespace, } } pub fn plain(name: impl Into) -> Self { Self { name: name.into(), namespace: None, } } pub fn namespaced(namespace: impl Into, name: impl Into) -> Self { Self { name: name.into(), namespace: Some(namespace.into()), } } pub fn display(&self) -> String { match &self.namespace { Some(namespace) => format!("{namespace}{}", self.name), None => self.name.clone(), } } } impl fmt::Display for ToolName { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match &self.namespace { Some(namespace) => write!(f, "{namespace}{}", self.name), None => f.write_str(&self.name), } } } impl From for ToolName { fn from(name: String) -> Self { Self::plain(name) } } impl From<&str> for ToolName { fn from(name: &str) -> Self { Self::plain(name) } }