use proc_macro2::TokenStream;
use quote::quote;
#[must_use]
pub fn instrument(entity_name: &str, op: &str) -> TokenStream {
quote! {
#[cfg_attr(
feature = "tracing",
::tracing::instrument(
skip_all,
fields(entity = #entity_name, op = #op),
err(Debug)
)
)]
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn emits_cfg_attr_gate() {
let tokens = instrument("User", "create").to_string();
assert!(
tokens.contains("cfg_attr"),
"must be feature-gated: {tokens}"
);
assert!(
tokens.contains("feature = \"tracing\""),
"wrong gate: {tokens}"
);
}
#[test]
fn carries_entity_and_op_fields() {
let tokens = instrument("User", "find_by_email").to_string();
assert!(
tokens.contains("entity = \"User\""),
"entity field missing: {tokens}"
);
assert!(
tokens.contains("op = \"find_by_email\""),
"op field missing: {tokens}"
);
}
#[test]
fn enables_err_event() {
let tokens = instrument("User", "create").to_string();
assert!(tokens.contains("err"), "err event missing: {tokens}");
}
#[test]
fn skips_all_args_by_default() {
let tokens = instrument("User", "create").to_string();
assert!(tokens.contains("skip_all"), "skip_all missing: {tokens}");
}
#[test]
fn references_tracing_via_absolute_path() {
let tokens = instrument("User", "create").to_string();
assert!(
tokens.contains(":: tracing :: instrument"),
"must use absolute path: {tokens}"
);
}
}