use std::borrow::Cow;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct Capability {
pub name: Cow<'static, str>,
pub description: Cow<'static, str>,
pub inputs: Vec<Cow<'static, str>>,
pub output: Cow<'static, str>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct AgentRegistration {
pub name: Cow<'static, str>,
pub version: Cow<'static, str>,
pub description: Cow<'static, str>,
pub capabilities: Vec<Capability>,
pub supported_languages: Vec<Cow<'static, str>>,
pub supported_scripts: Vec<Cow<'static, str>>,
}
#[must_use]
pub fn registration() -> AgentRegistration {
let lang_codes: Vec<Cow<'static, str>> = crate::registry::all_codes()
.iter()
.map(|&c| Cow::Borrowed(c))
.collect();
let script_codes: Vec<Cow<'static, str>> = crate::script::all_codes()
.iter()
.map(|&c| Cow::Borrowed(c))
.collect();
AgentRegistration {
name: Cow::Borrowed("varna"),
version: Cow::Borrowed(env!("CARGO_PKG_VERSION")),
description: Cow::Borrowed(
"Multilingual language engine: phoneme inventories, writing systems, \
grammar profiles, and lexicon access",
),
capabilities: vec![
Capability {
name: Cow::Borrowed("phoneme_lookup"),
description: Cow::Borrowed(
"Look up phoneme inventory for a language by ISO 639 code",
),
inputs: vec![Cow::Borrowed("language_code")],
output: Cow::Borrowed("PhonemeInventory"),
},
Capability {
name: Cow::Borrowed("script_lookup"),
description: Cow::Borrowed("Look up writing system metadata by ISO 15924 code"),
inputs: vec![Cow::Borrowed("script_code")],
output: Cow::Borrowed("Script"),
},
Capability {
name: Cow::Borrowed("grammar_profile"),
description: Cow::Borrowed(
"Get grammatical profile (morphology, word order, cases) for a language",
),
inputs: vec![Cow::Borrowed("language_code")],
output: Cow::Borrowed("GrammarProfile"),
},
Capability {
name: Cow::Borrowed("transliterate"),
description: Cow::Borrowed(
"Transliterate text between scripts (Devanagari↔IAST, Greek↔Beta Code)",
),
inputs: vec![Cow::Borrowed("text"), Cow::Borrowed("scheme")],
output: Cow::Borrowed("String"),
},
Capability {
name: Cow::Borrowed("language_compare"),
description: Cow::Borrowed(
"Compare phoneme inventories and grammar between two languages",
),
inputs: vec![Cow::Borrowed("lang1"), Cow::Borrowed("lang2")],
output: Cow::Borrowed("ComparisonResult"),
},
Capability {
name: Cow::Borrowed("numeral_value"),
description: Cow::Borrowed(
"Convert script numerals to numeric values (Greek isopsephy, Devanagari, etc.)",
),
inputs: vec![Cow::Borrowed("text"), Cow::Borrowed("system")],
output: Cow::Borrowed("u32"),
},
],
supported_languages: lang_codes,
supported_scripts: script_codes,
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_registration() {
let reg = registration();
assert_eq!(reg.name, "varna");
assert!(!reg.version.is_empty());
assert!(!reg.capabilities.is_empty());
assert!(reg.supported_languages.iter().any(|l| l == "en"));
assert!(reg.supported_scripts.iter().any(|s| s == "Latn"));
}
#[test]
fn test_registration_capabilities_count() {
let reg = registration();
assert_eq!(reg.capabilities.len(), 6);
}
#[test]
fn test_registration_serde_roundtrip() {
let reg = registration();
let json = serde_json::to_string(®).unwrap();
let back: AgentRegistration = serde_json::from_str(&json).unwrap();
assert_eq!(reg, back);
}
#[test]
fn test_registration_version_matches_cargo() {
let reg = registration();
assert_eq!(reg.version.as_ref(), env!("CARGO_PKG_VERSION"));
}
}