/// Identifies a callable tool, preserving the namespace split when the model /// provides one. #[derive(Clone, Debug, Eq, Hash, PartialEq)] pub struct ToolName { pub name: String, pub namespace: Option, } impl ToolName { 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 From for ToolName { fn from(name: String) -> Self { Self::plain(name) } } impl From<&str> for ToolName { fn from(name: &str) -> Self { Self::plain(name) } }