diff --git a/vidyut-prakriya/src/wasm.rs b/vidyut-prakriya/src/wasm.rs index 5809b25..f88b75e 100644 --- a/vidyut-prakriya/src/wasm.rs +++ b/vidyut-prakriya/src/wasm.rs @@ -152,7 +152,15 @@ struct KrdantaArgs { #[derive(Serialize, Deserialize)] struct PratipadikaArgs { basic: Option, + nyap: Option, krdanta: Option, + taddhitanta: Option, +} + +#[derive(Serialize, Deserialize)] +struct TaddhitantaArgsInner { + stem: String, + taddhita: Taddhita, } #[derive(Serialize, Deserialize)] @@ -173,6 +181,12 @@ struct TinantaArgs { pada: Option, } +#[derive(Serialize, Deserialize)] +struct TaddhitantaArgs { + pratipadika: PratipadikaArgs, + taddhita: Taddhita, +} + /// Shorthand for result type pub type Result = std::result::Result; @@ -212,12 +226,31 @@ impl SubantaArgs { let pratipadika = match self.pratipadika { PratipadikaArgs { basic: Some(basic), + nyap: None, krdanta: None, + taddhitanta: None, } => Pratipadika::basic(Slp1String::from(basic).expect("ok")), PratipadikaArgs { basic: None, + nyap: Some(nyap), + krdanta: None, + taddhitanta: None, + } => Pratipadika::nyap(Slp1String::from(nyap).expect("ok")), + PratipadikaArgs { + basic: None, + nyap: None, krdanta: Some(krt), + taddhitanta: None, } => Pratipadika::Krdanta(Box::new(krt.into_rust()?)), + PratipadikaArgs { + basic: None, + nyap: None, + krdanta: None, + taddhitanta: Some(tad), + } => { + let base = Pratipadika::basic(Slp1String::from(tad.stem).expect("ok")); + Pratipadika::Taddhitanta(Box::new(Taddhitanta::new(base, tad.taddhita))) + } // TODO: improve error handling, remove placeholder _ => Pratipadika::basic(Slp1String::from("doza").expect("ok")), }; @@ -245,6 +278,33 @@ impl TinantaArgs { } } +impl TaddhitantaArgs { + fn into_rust(self) -> Result { + let pratipadika = match self.pratipadika { + PratipadikaArgs { + basic: Some(basic), + nyap: None, + krdanta: None, + taddhitanta: None, + } => Pratipadika::basic(Slp1String::from(basic).expect("ok")), + PratipadikaArgs { + basic: None, + nyap: Some(nyap), + krdanta: None, + taddhitanta: None, + } => Pratipadika::nyap(Slp1String::from(nyap).expect("ok")), + PratipadikaArgs { + basic: None, + nyap: None, + krdanta: Some(krt), + taddhitanta: None, + } => Pratipadika::Krdanta(Box::new(krt.into_rust()?)), + _ => Pratipadika::basic(Slp1String::from("doza").expect("ok")), + }; + Ok(Taddhitanta::new(pratipadika, self.taddhita)) + } +} + /// WebAssembly API for vidyut-prakriya. /// /// Within reason, we have tried to mimic a native JavaScript API. At some point, we wish to @@ -343,4 +403,23 @@ impl Vidyut { } } } + + /// Wrapper for `Vyakarana::derive_taddhitantas`. + #[allow(non_snake_case)] + pub fn deriveTaddhitantas(&self, val: JsValue) -> JsValue { + let v = Vyakarana::new(); + let js_args: TaddhitantaArgs = serde_wasm_bindgen::from_value(val).unwrap(); + + match js_args.into_rust() { + Ok(args) => { + let prakriyas = v.derive_taddhitantas(&args); + let web_prakriyas = to_web_prakriyas(&prakriyas); + serde_wasm_bindgen::to_value(&web_prakriyas).expect("wasm") + } + Err(_) => { + error(&format!("[vidyut] Derivation error")); + serde_wasm_bindgen::to_value(&Vec::::new()).expect("wasm") + } + } + } }