use serde_json::{Map, Value};
#[derive(Debug, Clone, PartialEq, Eq, Default)]
pub struct SkillProperties {
pub name: String,
pub description: String,
pub license: Option<String>,
pub compatibility: Option<String>,
pub allowed_tools: Option<String>,
pub metadata: Vec<(String, String)>,
}
impl SkillProperties {
pub fn to_dict(&self) -> Value {
let mut result = Map::new();
result.insert("name".into(), Value::String(self.name.clone()));
result.insert(
"description".into(),
Value::String(self.description.clone()),
);
if let Some(license) = &self.license {
result.insert("license".into(), Value::String(license.clone()));
}
if let Some(compatibility) = &self.compatibility {
result.insert("compatibility".into(), Value::String(compatibility.clone()));
}
if let Some(allowed_tools) = &self.allowed_tools {
result.insert("allowed-tools".into(), Value::String(allowed_tools.clone()));
}
if !self.metadata.is_empty() {
let mut meta = Map::new();
for (k, v) in &self.metadata {
meta.insert(k.clone(), Value::String(v.clone()));
}
result.insert("metadata".into(), Value::Object(meta));
}
Value::Object(result)
}
pub fn to_json(&self) -> String {
serde_json::to_string_pretty(&self.to_dict()).expect("SkillProperties serializes")
}
}