Skip to main content

acta_wasm/
lib.rs

1#![deny(unsafe_code)]
2
3#[cfg(target_arch = "wasm32")]
4use wasm_bindgen::prelude::*;
5
6#[cfg(target_arch = "wasm32")]
7#[wasm_bindgen]
8pub struct Logger {
9    inner: Option<acta_abi::Logger>,
10}
11
12#[cfg(target_arch = "wasm32")]
13#[wasm_bindgen]
14impl Logger {
15    #[wasm_bindgen(constructor)]
16    pub fn new(config_json: &str, capacity: u32) -> Result<Logger, JsValue> {
17        acta_abi::Logger::from_config_json(config_json, capacity as usize)
18            .map(|logger| Self {
19                inner: Some(logger),
20            })
21            .map_err(js_error)
22    }
23
24    pub fn log(&self, level: u32, message: &str) -> Result<(), JsValue> {
25        self.with(|logger| logger.log(level, message))
26    }
27
28    pub fn drain(&self, max_bytes: u32) -> Result<Vec<u8>, JsValue> {
29        self.with(|logger| Ok(logger.drain(max_bytes as usize)))
30    }
31
32    pub fn event(&self, event_json: &str) -> Result<(), JsValue> {
33        self.with(|logger| logger.event_json(event_json))
34    }
35
36    #[wasm_bindgen(js_name = createSpan)]
37    pub fn create_span(&self, event_json: &str) -> Result<u32, JsValue> {
38        self.with(|logger| logger.create_span_json(event_json))
39    }
40
41    #[wasm_bindgen(js_name = recordSpan)]
42    pub fn record_span(&self, id: u32, fields_json: &str) -> Result<(), JsValue> {
43        self.with(|logger| logger.record_span_json(id, fields_json))
44    }
45
46    #[wasm_bindgen(js_name = closeSpan)]
47    pub fn close_span(&self, id: u32) -> Result<(), JsValue> {
48        self.with(|logger| logger.close_span(id))
49    }
50
51    pub fn dropped(&self) -> Result<u64, JsValue> {
52        self.with(|logger| Ok(logger.dropped()))
53    }
54
55    #[wasm_bindgen(js_name = setFilter)]
56    pub fn set_filter(&self, filter: &str) -> Result<(), JsValue> {
57        self.with(|logger| logger.set_filter(filter))
58    }
59
60    pub fn close(&mut self) {
61        self.inner.take();
62    }
63}
64
65#[cfg(target_arch = "wasm32")]
66#[wasm_bindgen(js_name = abiVersion)]
67pub fn abi_version() -> u32 {
68    acta_abi::ABI_VERSION
69}
70
71#[cfg(target_arch = "wasm32")]
72#[wasm_bindgen]
73pub fn version() -> String {
74    acta_abi::VERSION.to_owned()
75}
76
77#[cfg(target_arch = "wasm32")]
78impl Logger {
79    fn with<T>(
80        &self,
81        operation: impl FnOnce(&acta_abi::Logger) -> acta_abi::Result<T>,
82    ) -> Result<T, JsValue> {
83        let logger = self
84            .inner
85            .as_ref()
86            .ok_or_else(|| JsValue::from_str("Logger is closed"))?;
87        operation(logger).map_err(js_error)
88    }
89}
90
91#[cfg(target_arch = "wasm32")]
92fn js_error(error: acta_abi::Error) -> JsValue {
93    JsValue::from_str(&error.to_string())
94}