Skip to main content

acta_napi/
lib.rs

1use napi::bindgen_prelude::{BigInt, Buffer};
2use napi_derive::napi;
3
4const DEFAULT_CAPACITY: u32 = 64 * 1024;
5const DEFAULT_DRAIN: u32 = 64 * 1024;
6
7fn reason(error: acta_abi::Error) -> napi::Error {
8    napi::Error::from_reason(error.to_string())
9}
10
11#[napi]
12pub struct Logger {
13    inner: Option<acta_abi::Logger>,
14}
15
16#[napi]
17impl Logger {
18    #[napi(constructor)]
19    pub fn new(config: Option<serde_json::Value>, capacity: Option<u32>) -> napi::Result<Self> {
20        let config = config.unwrap_or_else(|| serde_json::Value::Object(serde_json::Map::new()));
21        acta_abi::Logger::from_config_value(config, capacity.unwrap_or(DEFAULT_CAPACITY) as usize)
22            .map(|logger| Self {
23                inner: Some(logger),
24            })
25            .map_err(reason)
26    }
27
28    #[napi]
29    pub fn log(&self, level: u32, message: String) -> napi::Result<()> {
30        self.with(|logger| logger.log(level, &message).map_err(reason))
31    }
32
33    #[napi]
34    pub fn event(&self, event: serde_json::Value) -> napi::Result<()> {
35        self.with(|logger| logger.event_value(event).map_err(reason))
36    }
37
38    #[napi]
39    pub fn create_span(&self, event: serde_json::Value) -> napi::Result<u32> {
40        self.with(|logger| logger.create_span_value(event).map_err(reason))
41    }
42
43    #[napi]
44    pub fn record_span(&self, id: u32, fields: serde_json::Value) -> napi::Result<()> {
45        self.with(|logger| logger.record_span_value(id, fields).map_err(reason))
46    }
47
48    #[napi]
49    pub fn close_span(&self, id: u32) -> napi::Result<()> {
50        self.with(|logger| logger.close_span(id).map_err(reason))
51    }
52
53    #[napi]
54    pub fn drain(&self, max_bytes: Option<u32>) -> napi::Result<Buffer> {
55        self.with(|logger| {
56            Ok(Buffer::from(
57                logger.drain(max_bytes.unwrap_or(DEFAULT_DRAIN) as usize),
58            ))
59        })
60    }
61
62    #[napi]
63    pub fn dropped(&self) -> napi::Result<BigInt> {
64        self.with(|logger| {
65            Ok(BigInt {
66                sign_bit: false,
67                words: vec![logger.dropped()],
68            })
69        })
70    }
71
72    #[napi]
73    pub fn set_filter(&self, filter: String) -> napi::Result<()> {
74        self.with(|logger| logger.set_filter(&filter).map_err(reason))
75    }
76
77    #[napi]
78    pub fn close(&mut self) {
79        self.inner.take();
80    }
81
82    fn with<T>(
83        &self,
84        operation: impl FnOnce(&acta_abi::Logger) -> napi::Result<T>,
85    ) -> napi::Result<T> {
86        operation(
87            self.inner
88                .as_ref()
89                .ok_or_else(|| napi::Error::from_reason("Logger is closed"))?,
90        )
91    }
92}
93
94#[napi]
95pub fn abi_version() -> u32 {
96    acta_abi::ABI_VERSION
97}
98
99#[napi]
100pub fn version() -> String {
101    acta_abi::VERSION.to_owned()
102}