pub use log::{debug, error, info, trace, warn};
pub use log::{Level, LevelFilter};
pub mod targets {
pub const FASTMCP: &str = "fastmcp_rust";
pub const SERVER: &str = "fastmcp_rust::server";
pub const TRANSPORT: &str = "fastmcp_rust::transport";
pub const ROUTER: &str = "fastmcp_rust::router";
pub const HANDLER: &str = "fastmcp_rust::handler";
pub const SESSION: &str = "fastmcp_rust::session";
pub const CODEC: &str = "fastmcp_rust::codec";
}
#[inline]
#[must_use]
pub fn is_enabled(level: Level, target: &str) -> bool {
log::log_enabled!(target: target, level)
}
#[macro_export]
macro_rules! log_server {
($($arg:tt)*) => {
log::info!(target: "fastmcp_rust::server", $($arg)*)
};
}
#[macro_export]
macro_rules! log_transport {
($($arg:tt)*) => {
log::debug!(target: "fastmcp_rust::transport", $($arg)*)
};
}
#[macro_export]
macro_rules! log_router {
($($arg:tt)*) => {
log::debug!(target: "fastmcp_rust::router", $($arg)*)
};
}
#[macro_export]
macro_rules! log_handler {
($($arg:tt)*) => {
log::debug!(target: "fastmcp_rust::handler", $($arg)*)
};
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn log_targets_are_hierarchical() {
assert!(targets::SERVER.starts_with(targets::FASTMCP));
assert!(targets::TRANSPORT.starts_with(targets::FASTMCP));
assert!(targets::ROUTER.starts_with(targets::FASTMCP));
assert!(targets::HANDLER.starts_with(targets::FASTMCP));
assert!(targets::SESSION.starts_with(targets::FASTMCP));
assert!(targets::CODEC.starts_with(targets::FASTMCP));
}
#[test]
fn level_ordering() {
assert!(Level::Error < Level::Warn);
assert!(Level::Warn < Level::Info);
assert!(Level::Info < Level::Debug);
assert!(Level::Debug < Level::Trace);
}
#[test]
fn is_enabled_returns_bool_without_panic() {
let result = is_enabled(Level::Info, targets::FASTMCP);
assert!(!result); }
#[test]
fn target_constants_have_expected_values() {
assert_eq!(targets::FASTMCP, "fastmcp_rust");
assert_eq!(targets::SERVER, "fastmcp_rust::server");
assert_eq!(targets::TRANSPORT, "fastmcp_rust::transport");
assert_eq!(targets::ROUTER, "fastmcp_rust::router");
assert_eq!(targets::HANDLER, "fastmcp_rust::handler");
assert_eq!(targets::SESSION, "fastmcp_rust::session");
assert_eq!(targets::CODEC, "fastmcp_rust::codec");
}
#[test]
fn target_constants_are_all_distinct() {
let all = [
targets::FASTMCP,
targets::SERVER,
targets::TRANSPORT,
targets::ROUTER,
targets::HANDLER,
targets::SESSION,
targets::CODEC,
];
for i in 0..all.len() {
for j in (i + 1)..all.len() {
assert_ne!(all[i], all[j], "targets at {} and {} collide", i, j);
}
}
}
#[test]
fn log_macros_compile_and_do_not_panic() {
log_server!("test server event: {}", 42);
log_transport!("test transport event");
log_router!("test router event: {}", "route");
log_handler!("test handler event");
}
}