1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#[macro_use]
extern crate wascc_codec as codec;
#[macro_use]
extern crate log;
use codec::capabilities::{CapabilityProvider, Dispatcher, NullDispatcher};
use codec::core::{OP_BIND_ACTOR, OP_REMOVE_ACTOR};
use std::error::Error;
use std::sync::{Arc, RwLock};
use wasmcloud_actor_core::deserialize;
use wasmcloud_actor_logging::{WriteLogArgs, OP_LOG};
#[cfg(not(feature = "static_plugin"))]
capability_provider!(LoggingProvider, LoggingProvider::new);
#[allow(unused)]
const CAPABILITY_ID: &str = "wasmcloud:logging";
const SYSTEM_ACTOR: &str = "system";
const ERROR: &str = "error";
const WARN: &str = "warn";
const INFO: &str = "info";
const DEBUG: &str = "debug";
const TRACE: &str = "trace";
#[derive(Clone)]
pub struct LoggingProvider {
dispatcher: Arc<RwLock<Box<dyn Dispatcher>>>,
}
impl Default for LoggingProvider {
fn default() -> Self {
match env_logger::try_init() {
Ok(_) => {}
Err(_) => {}
}
LoggingProvider {
dispatcher: Arc::new(RwLock::new(Box::new(NullDispatcher::new()))),
}
}
}
impl LoggingProvider {
pub fn new() -> Self {
Self::default()
}
fn write_log(
&self,
actor: &str,
log_msg: WriteLogArgs,
) -> Result<Vec<u8>, Box<dyn Error + Sync + Send>> {
match &*log_msg.level {
ERROR => error!(target: &log_msg.target, "[{}] {}", actor, log_msg.text),
WARN => warn!(target: &log_msg.target, "[{}] {}", actor, log_msg.text),
INFO => info!(target: &log_msg.target, "[{}] {}", actor, log_msg.text),
DEBUG => debug!(target: &log_msg.target, "[{}] {}", actor, log_msg.text),
TRACE => trace!(target: &log_msg.target, "[{}] {}", actor, log_msg.text),
_ => error!("Unknown log level: {}", log_msg.level),
}
Ok(vec![])
}
}
impl CapabilityProvider for LoggingProvider {
fn configure_dispatch(
&self,
dispatcher: Box<dyn Dispatcher>,
) -> Result<(), Box<dyn Error + Sync + Send>> {
info!("Dispatcher configured.");
let mut lock = self.dispatcher.write().unwrap();
*lock = dispatcher;
Ok(())
}
fn handle_call(
&self,
actor: &str,
op: &str,
msg: &[u8],
) -> Result<Vec<u8>, Box<dyn Error + Sync + Send>> {
trace!("Handling operation `{}` from `{}`", op, actor);
match op {
OP_BIND_ACTOR if actor == SYSTEM_ACTOR => Ok(vec![]),
OP_REMOVE_ACTOR if actor == SYSTEM_ACTOR => Ok(vec![]),
OP_LOG => self.write_log(actor, deserialize(msg)?),
_ => Err(format!("Unknown operation: {}", op).into()),
}
}
fn stop(&self) {}
}