use crate::sys::{
editor::{
self,
IModelContentChangedEvent,
IModelLanguageChangedEvent,
IModelOptionsChangedEvent,
ITextModel,
},
Uri,
};
use wasm_bindgen::{JsCast, JsValue};
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct TextModel {
js_model: ITextModel,
}
impl TextModel {
event_methods! {
pub on_did_change_content(FnMut(IModelContentChangedEvent));
pub on_did_change_decorations(FnMut(JsValue));
pub on_did_change_language(FnMut(IModelLanguageChangedEvent));
pub on_did_change_language_configuration(FnMut(JsValue));
pub on_did_change_options(FnMut(IModelOptionsChangedEvent));
pub on_will_dispose(FnMut());
}
pub fn create(value: &str, language: Option<&str>, uri: Option<&Uri>) -> Result<Self, JsValue> {
editor::create_model(value, language, uri).map(Self::from)
}
pub fn get(uri: &Uri) -> Option<Self> {
editor::get_model(uri).map(Self::from)
}
pub fn get_or_create(uri: &Uri, value: &str, language: Option<&str>) -> Result<Self, JsValue> {
if let Some(model) = Self::get(uri) {
model.set_value(value);
if let Some(language) = language {
model.set_language(language);
}
Ok(model)
} else {
Self::create(value, language, Some(uri))
}
}
pub fn get_all() -> Vec<Self> {
editor::get_models()
.iter()
.map(JsCast::unchecked_into::<ITextModel>)
.map(Self::from)
.collect()
}
pub fn id(&self) -> String {
self.js_model.id()
}
pub fn uri(&self) -> Uri {
self.js_model.uri()
}
pub fn get_language(&self) -> String {
self.js_model.get_mode_id()
}
pub fn set_language(&self, language_id: &str) {
editor::set_model_language(self.as_ref(), language_id);
}
pub fn get_value(&self) -> String {
self.js_model.get_value(None, None)
}
pub fn set_value(&self, value: &str) {
self.js_model.set_value(value)
}
}
impl AsRef<ITextModel> for TextModel {
fn as_ref(&self) -> &ITextModel {
&self.js_model
}
}
impl From<ITextModel> for TextModel {
fn from(js_model: ITextModel) -> Self {
Self { js_model }
}
}