use tracing_wide::{
Message, event, message,
subscriber::{Subscriber, Subscribers},
};
struct Analytics;
struct Database;
#[message(msg = "config changed", level = warn, tags = ["audit", "persist"])]
struct ConfigChanged {
key: &'static str,
}
#[message(msg = "page viewed", tags = ["analytics"])]
struct PageViewed {
path: &'static str,
}
#[message(msg = "payment captured", tags = ["analytics", "persist"])]
struct PaymentCaptured {
amount_cents: u64,
currency: &'static str,
}
impl Subscriber for Analytics {
fn on_message(&self, m: &dyn Message) {
if m.tags().contains(&"analytics") {
println!("[analytics] forward {:?} ({})", m.msg(), m.origin());
}
}
}
impl Subscriber for Database {
fn on_message(&self, m: &dyn Message) {
if m.tags().contains(&"persist") {
println!("[db] store {:?} ({})", m.msg(), m.origin());
}
}
}
fn main() {
let mut subscribers = Subscribers::default();
subscribers.register(Box::new(Database));
subscribers.register(Box::new(Analytics));
subscribers.install().ok();
event!(PaymentCaptured {
amount_cents: 4200,
currency: "EUR"
});
event!(PageViewed { path: "/pricing" });
event!(ConfigChanged {
key: "feature.flags"
});
}