use proc_macro2::TokenStream;
use quote::quote;
#[must_use]
pub fn instrument(entity_name: &str, op: &str) -> TokenStream {
if !cfg!(feature = "tracing") {
return TokenStream::new();
}
quote! {
#[::tracing::instrument(
skip_all,
fields(entity = #entity_name, op = #op),
err(Debug)
)]
}
}
#[cfg(all(test, feature = "tracing"))]
mod tests {
use super::*;
#[test]
fn emits_plain_instrument_attribute() {
let tokens = instrument("User", "create").to_string();
assert!(
!tokens.contains("cfg_attr"),
"expansion-time gating must not leak cfgs: {tokens}"
);
assert!(tokens.contains("instrument"));
}
#[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}"
);
}
}