use serde_json::{Map, Value};
use crate::yaml::FmValue;
#[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)>,
pub claude: Vec<(String, FmValue)>,
}
fn fmvalue_to_json(value: &FmValue) -> Value {
match value {
FmValue::Str(s) => Value::String(s.clone()),
FmValue::Seq(items) => Value::Array(items.iter().map(fmvalue_to_json).collect()),
FmValue::Map(entries) => {
let mut map = Map::new();
for (k, v) in entries {
map.insert(k.clone(), fmvalue_to_json(v));
}
Value::Object(map)
}
}
}
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));
}
for (k, v) in &self.claude {
result.insert(k.clone(), fmvalue_to_json(v));
}
Value::Object(result)
}
pub fn to_json(&self) -> String {
serde_json::to_string_pretty(&self.to_dict()).expect("SkillProperties serializes")
}
}