workflow_terminal/terminal/
bindings.rs

1//!
2//! [xterm.js](http://xtermjs.org) [`mod@wasm_bindgen`] interface and plugin bindings
3//!
4
5use std::fmt::Debug;
6use std::fmt::Formatter;
7use wasm_bindgen::prelude::wasm_bindgen;
8use wasm_bindgen::JsValue;
9use web_sys::Element;
10
11#[wasm_bindgen]
12extern "C" {
13
14    #[wasm_bindgen(js_namespace=["window", "FitAddon"], js_name="FitAddon")]
15    pub type FitAddon;
16
17    #[wasm_bindgen(
18        constructor,
19        js_class = "window.FitAddon.FitAddon",
20        js_name = "FitAddon"
21    )]
22    pub fn new() -> FitAddon;
23
24    #[wasm_bindgen(method, js_name = "proposeDimensions")]
25    pub fn propose_dimensions(this: &FitAddon);
26
27    #[wasm_bindgen(method, js_name = "fit")]
28    pub fn fit(this: &FitAddon);
29}
30
31#[wasm_bindgen]
32extern "C" {
33
34    #[wasm_bindgen(js_namespace=["window","WebLinksAddon"], js_name="WebLinksAddon")]
35    pub type WebLinksAddon;
36
37    #[wasm_bindgen(
38        constructor,
39        js_class = "window.WebLinksAddon.WebLinksAddon",
40        js_name = "WebLinksAddon"
41    )]
42    pub fn new(callback: JsValue) -> WebLinksAddon;
43}
44
45#[wasm_bindgen]
46extern "C" {
47    #[wasm_bindgen(extends = js_sys::Object)]
48    pub type XtermCoreImpl;
49    #[wasm_bindgen(method, js_name = "_setTheme")]
50    pub fn set_theme(this: &XtermCoreImpl, them: js_sys::Object);
51
52    #[wasm_bindgen(extends = js_sys::Object)]
53    pub type XtermEvent;
54
55    #[wasm_bindgen(method, getter, js_name = "domEvent")]
56    pub fn get_dom_event(this: &XtermEvent) -> web_sys::KeyboardEvent;
57    #[wasm_bindgen(method, getter, js_name = "key")]
58    pub fn get_key(this: &XtermEvent) -> String;
59
60    #[wasm_bindgen(js_namespace=window, js_name="Terminal")]
61    pub type XtermImpl;
62
63    #[wasm_bindgen(constructor, js_class = "Terminal")]
64    pub fn new(opt: js_sys::Object) -> XtermImpl;
65
66    #[wasm_bindgen(method)]
67    pub fn focus(this: &XtermImpl);
68
69    #[wasm_bindgen(method, getter)]
70    pub fn number(this: &XtermImpl) -> u32;
71
72    #[wasm_bindgen(method, getter, js_name = "_core")]
73    pub fn core(this: &XtermImpl) -> XtermCoreImpl;
74
75    #[wasm_bindgen(method)]
76    pub fn open(this: &XtermImpl, el: &Element);
77
78    #[wasm_bindgen(method, js_name = "setOption")]
79    pub fn set_option(this: &XtermImpl, name: &str, option: JsValue);
80
81    #[wasm_bindgen(method, js_name = "getOption")]
82    pub fn get_option(this: &XtermImpl, name: &str) -> JsValue;
83
84    #[wasm_bindgen(method)]
85    pub fn refresh(this: &XtermImpl, start: u32, stop: u32);
86
87    #[wasm_bindgen(method, getter, js_name = "rows")]
88    pub fn rows(this: &XtermImpl) -> u32;
89
90    #[wasm_bindgen(method, getter, js_name = "cols")]
91    pub fn cols(this: &XtermImpl) -> u32;
92
93    #[wasm_bindgen(method, js_name = "onKey")]
94    pub fn on_key(this: &XtermImpl, f: &js_sys::Function);
95
96    #[wasm_bindgen(method, js_name = "write")]
97    fn _write(this: &XtermImpl, text: String);
98
99    // #[wasm_bindgen(method, js_name="paste")]
100    // fn _paste(this: &XtermImpl, text:String);
101
102    #[wasm_bindgen(method, js_name = "loadAddon")]
103    pub fn load_addon(this: &XtermImpl, addon: JsValue);
104
105    #[wasm_bindgen(method, getter, js_name = "element")]
106    pub fn get_element(this: &XtermImpl) -> Element;
107
108    #[wasm_bindgen(method, js_name = "getSelection")]
109    pub fn get_selection(this: &XtermImpl) -> String;
110
111    #[wasm_bindgen(method, js_name = "registerLinkMatcher")]
112    pub fn register_link_matcher(
113        this: &XtermImpl,
114        regexp: &js_sys::RegExp,
115        callback: &js_sys::Function,
116    );
117
118    // future versions of xterm.js
119    // #[wasm_bindgen(method, js_name = "getSelectionService")]
120    // pub fn get_selection_service(this: &XtermImpl) -> SelectionService;
121    // #[wasm_bindgen(extends = js_sys::Object)]
122    // pub type SelectionService;
123    // #[wasm_bindgen(method, js_name = "getSelection")]
124    // pub fn get_selection(this: &SelectionService) -> String;
125
126}
127
128impl Debug for XtermImpl {
129    fn fmt(&self, f: &mut Formatter<'_>) -> std::result::Result<(), std::fmt::Error> {
130        write!(f, "Workflow Xterm")?;
131        Ok(())
132    }
133}
134
135impl XtermImpl {
136    pub fn write<T: ToString>(&self, text: T) {
137        self._write(text.to_string());
138    }
139
140    pub fn set_theme(&self, theme: js_sys::Object) {
141        self.set_option("theme", theme.into());
142        //self.core().set_theme(theme);
143    }
144}
145
146#[wasm_bindgen]
147extern "C" {
148    #[wasm_bindgen (extends = :: js_sys :: Object , js_name = ResizeObserver , typescript_type = "ResizeObserver")]
149    #[derive(Debug, Clone, PartialEq, Eq)]
150    pub type ResizeObserver;
151    #[wasm_bindgen(catch, constructor, js_class = "ResizeObserver")]
152    pub fn new(callback: &::js_sys::Function) -> std::result::Result<ResizeObserver, JsValue>;
153    #[wasm_bindgen (method , structural , js_class = "ResizeObserver" , js_name = disconnect)]
154    pub fn disconnect(this: &ResizeObserver);
155    #[wasm_bindgen (method , structural , js_class = "ResizeObserver" , js_name = observe)]
156    pub fn observe(this: &ResizeObserver, target: &Element);
157    // # [wasm_bindgen (method , structural , js_class = "ResizeObserver" , js_name = observe)]
158    // pub fn observe_with_options(
159    //     this: &ResizeObserver,
160    //     target: &Element,
161    //     options: &ResizeObserverOptions,
162    // );
163    // # [wasm_bindgen (method , structural , js_class = "ResizeObserver" , js_name = unobserve)]
164    pub fn unobserve(this: &ResizeObserver, target: &Element);
165}
166
167// #[wasm_bindgen]
168// extern "C" {
169//     #[wasm_bindgen (extends = web_sys::Event , extends = :: js_sys :: Object , js_name = ClipboardEvent , typescript_type = "ClipboardEvent")]
170//     #[derive(Debug, Clone, PartialEq, Eq)]
171//     pub type ClipboardEvent;
172//     #[wasm_bindgen (structural , method , getter , js_class = "ClipboardEvent" , js_name = clipboardData)]
173//     pub fn clipboard_data(this: &ClipboardEvent) -> Option<web_sys::DataTransfer>;
174//     #[wasm_bindgen(catch, constructor, js_class = "ClipboardEvent")]
175//     pub fn new(type_: &str) -> Result<ClipboardEvent, JsValue>;
176//     // #[wasm_bindgen(catch, constructor, js_class = "ClipboardEvent")]
177//     // pub fn new_with_event_init_dict(
178//     //     type_: &str,
179//     //     event_init_dict: &ClipboardEventInit,
180//     // ) -> Result<ClipboardEvent, JsValue>;
181// }