tex_fmt/
wasm.rs

1//! Web assembly implementation
2
3use js_sys::{Object, Reflect};
4use merge::Merge;
5use std::path::PathBuf;
6use wasm_bindgen::prelude::*;
7
8use crate::args::{Args, OptionArgs};
9use crate::config::get_config_args;
10use crate::format::format_file;
11use crate::logging::{format_logs, Log};
12
13/// Main function for WASM interface with JS
14///
15/// # Panics
16///
17/// This function panics if the config cannot be parsed
18#[wasm_bindgen]
19#[must_use]
20pub fn main(text: &str, config: &str) -> JsValue {
21    // Get args
22    let config = Some((PathBuf::new(), String::new(), config.to_string()));
23    let mut args: OptionArgs = get_config_args(config).unwrap();
24    args.merge(OptionArgs::default());
25    let mut args = Args::from(args);
26    args.stdin = true;
27
28    // Run tex-fmt
29    let mut logs = Vec::<Log>::new();
30    args.resolve(&mut logs);
31    let file = PathBuf::from("input");
32    let new_text = format_file(text, &file, &args, &mut logs);
33    let logs = format_logs(&mut logs, &args);
34
35    // Wrap into JS object
36    let js_object = Object::new();
37    Reflect::set(&js_object, &"output".into(), &new_text.into()).unwrap();
38    Reflect::set(&js_object, &"logs".into(), &logs.into()).unwrap();
39    js_object.into()
40}