From dfea603cec181f95d1fab21631790b27c5844137 Mon Sep 17 00:00:00 2001 From: bharathrao Date: Sat, 31 Jan 2026 17:49:11 -0600 Subject: [PATCH 1/2] feat(wasm): Add nyap pratipadika and taddhitantas support to WASM bindings MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add `nyap` field to `PratipadikaArgs` struct to support feminine stems with nyāp pratyayas (ṭāp, ṅīp, etc.) in the WebAssembly API. Add `deriveTaddhitantas` method to support taddhita derivation, allowing proper derivation of stems like damana + matup → damanavat. Example usage: ```javascript // Feminine stems with nyap vidyut.deriveSubantas({ pratipadika: { nyap: 'nadI' }, linga: 'Stri', vibhakti: 'Prathama', vacana: 'Eka', }) // Returns: ['nadI'] // Taddhita derivation vidyut.deriveTaddhitantas({ pratipadika: { basic: 'damana' }, taddhita: 'matup', }) // Returns: ['damanavat'] ``` Co-Authored-By: Claude Opus 4.5 --- vidyut-prakriya/src/wasm.rs | 57 +++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/vidyut-prakriya/src/wasm.rs b/vidyut-prakriya/src/wasm.rs index 5809b25a..fadbf402 100644 --- a/vidyut-prakriya/src/wasm.rs +++ b/vidyut-prakriya/src/wasm.rs @@ -152,6 +152,7 @@ struct KrdantaArgs { #[derive(Serialize, Deserialize)] struct PratipadikaArgs { basic: Option, + nyap: Option, krdanta: Option, } @@ -173,6 +174,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,10 +219,17 @@ impl SubantaArgs { let pratipadika = match self.pratipadika { PratipadikaArgs { basic: Some(basic), + nyap: None, krdanta: None, } => Pratipadika::basic(Slp1String::from(basic).expect("ok")), PratipadikaArgs { basic: None, + nyap: Some(nyap), + krdanta: None, + } => Pratipadika::nyap(Slp1String::from(nyap).expect("ok")), + PratipadikaArgs { + basic: None, + nyap: None, krdanta: Some(krt), } => Pratipadika::Krdanta(Box::new(krt.into_rust()?)), // TODO: improve error handling, remove placeholder @@ -245,6 +259,30 @@ impl TinantaArgs { } } +impl TaddhitantaArgs { + fn into_rust(self) -> Result { + let pratipadika = match self.pratipadika { + PratipadikaArgs { + basic: Some(basic), + nyap: None, + krdanta: None, + } => Pratipadika::basic(Slp1String::from(basic).expect("ok")), + PratipadikaArgs { + basic: None, + nyap: Some(nyap), + krdanta: None, + } => Pratipadika::nyap(Slp1String::from(nyap).expect("ok")), + PratipadikaArgs { + basic: None, + nyap: None, + krdanta: Some(krt), + } => 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 +381,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") + } + } + } } From 7043fdb87c6e1d53d5f2871449b446345629dbdd Mon Sep 17 00:00:00 2001 From: bharathrao Date: Sat, 31 Jan 2026 18:43:38 -0600 Subject: [PATCH 2/2] Add taddhitanta pratipadika support to WASM API Extends the PratipadikaArgs struct to support taddhitanta type, allowing proper declension of taddhita-derived stems (like -vat/-mat stems from matup). This enables stems like "amavat" (from ama + matup) to decline correctly to "amavAn" for Nom.M.S, following proper Sanskrit grammar rules. Co-Authored-By: Claude Opus 4.5 --- vidyut-prakriya/src/wasm.rs | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/vidyut-prakriya/src/wasm.rs b/vidyut-prakriya/src/wasm.rs index fadbf402..f88b75ee 100644 --- a/vidyut-prakriya/src/wasm.rs +++ b/vidyut-prakriya/src/wasm.rs @@ -154,6 +154,13 @@ struct PratipadikaArgs { basic: Option, nyap: Option, krdanta: Option, + taddhitanta: Option, +} + +#[derive(Serialize, Deserialize)] +struct TaddhitantaArgsInner { + stem: String, + taddhita: Taddhita, } #[derive(Serialize, Deserialize)] @@ -221,17 +228,29 @@ impl SubantaArgs { 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")), }; @@ -266,16 +285,19 @@ impl TaddhitantaArgs { 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")), };