use super::prelude::*;
use crate::layout::Layout as RustLayout;
use crate::settings::{
WikitextMode as RustWikitextMode, WikitextSettings as RustWikitextSettings,
};
use std::sync::Arc;
#[wasm_bindgen(typescript_custom_section)]
const TS_APPEND_CONTENT: &str = r#"
export interface IWikitextSettings {
mode: WikitextMode;
enable_page_syntax: boolean;
use_true_ids: boolean;
allow_local_paths: boolean;
}
export type WikitextMode =
| 'page'
| 'draft'
| 'forum-post'
| 'direct-message'
| 'list'
"#;
#[wasm_bindgen]
extern "C" {
#[wasm_bindgen(typescript_type = "IWikitextSettings")]
pub type IWikitextSettings;
}
#[wasm_bindgen]
#[derive(Debug, Clone)]
pub struct WikitextSettings {
inner: Arc<RustWikitextSettings>,
}
#[wasm_bindgen]
impl WikitextSettings {
#[inline]
pub(crate) fn get(&self) -> &RustWikitextSettings {
&self.inner
}
#[wasm_bindgen]
pub fn copy(&self) -> WikitextSettings {
WikitextSettings {
inner: Arc::clone(&self.inner),
}
}
#[wasm_bindgen(constructor)]
pub fn new(settings: IWikitextSettings) -> Result<WikitextSettings, JsValue> {
let settings: JsValue = settings.into();
Ok(WikitextSettings {
inner: Arc::new(js_to_rust!(settings)?),
})
}
#[wasm_bindgen]
pub fn from_mode(mode: String, layout: String) -> Result<WikitextSettings, JsValue> {
let rust_mode = match mode.as_str() {
"page" => RustWikitextMode::Page,
"draft" => RustWikitextMode::Draft,
"forum-post" => RustWikitextMode::ForumPost,
"direct-message" => RustWikitextMode::DirectMessage,
"list" => RustWikitextMode::List,
_ => return Err(JsValue::from_str("Unknown mode")),
};
let rust_layout = match layout.as_str() {
"wikidot" => RustLayout::Wikidot,
"wikijump" => RustLayout::Wikijump,
_ => return Err(JsValue::from_str("Unknown layout")),
};
Ok(WikitextSettings {
inner: Arc::new(RustWikitextSettings::from_mode(rust_mode, rust_layout)),
})
}
}