use std::collections::BTreeMap;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Default, Deserialize, Serialize, PartialEq)]
pub struct VerbClass {
pub name: String,
#[serde(default)]
pub valence: String,
#[serde(default, skip_serializing_if = "String::is_empty")]
pub note: String,
}
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
pub struct GrammarSpec {
#[serde(default)]
pub grammar: BTreeMap<String, String>,
#[serde(default)]
pub ug_parameters: BTreeMap<String, String>,
#[serde(default)]
pub verb_classes: Vec<VerbClass>,
}
impl GrammarSpec {
pub fn has_content(&self) -> bool {
!self.grammar.is_empty() || !self.ug_parameters.is_empty() || !self.verb_classes.is_empty()
}
pub fn from_hjson(body: &str) -> Result<Option<Self>, String> {
if body.trim().is_empty() {
return Ok(None);
}
let block = crate::language_entry::extract_hjson_block(body).unwrap_or(body);
match serde_hjson::from_str::<Self>(block) {
Ok(s) if s.has_content() => Ok(Some(s)),
Ok(_) => Ok(None),
Err(e) => Err(format!("grammar HJSON parse failed: {e}")),
}
}
}