Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
79 changes: 79 additions & 0 deletions vidyut-prakriya/src/wasm.rs
Original file line number Diff line number Diff line change
Expand Up @@ -152,7 +152,15 @@ struct KrdantaArgs {
#[derive(Serialize, Deserialize)]
struct PratipadikaArgs {
basic: Option<String>,
nyap: Option<String>,
krdanta: Option<KrdantaArgs>,
taddhitanta: Option<TaddhitantaArgsInner>,
}

#[derive(Serialize, Deserialize)]
struct TaddhitantaArgsInner {
stem: String,
taddhita: Taddhita,
}

#[derive(Serialize, Deserialize)]
Expand All @@ -173,6 +181,12 @@ struct TinantaArgs {
pada: Option<DhatuPada>,
}

#[derive(Serialize, Deserialize)]
struct TaddhitantaArgs {
pratipadika: PratipadikaArgs,
taddhita: Taddhita,
}

/// Shorthand for result type
pub type Result<T> = std::result::Result<T, Error>;

Expand Down Expand Up @@ -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")),
};
Expand Down Expand Up @@ -245,6 +278,33 @@ impl TinantaArgs {
}
}

impl TaddhitantaArgs {
fn into_rust(self) -> Result<Taddhitanta> {
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
Expand Down Expand Up @@ -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::<WebPrakriya>::new()).expect("wasm")
}
}
}
}