use metrique::{
test_util::test_metric,
unit_of_work::metrics,
writer::{unit, value::ToString},
};
use metrique_writer_core::SampleGroup;
#[metrics]
#[derive(Clone)]
pub struct NestedMetrics {
value: u32,
}
#[metrics]
enum VariantNameOverride {
#[metrics(name = "custom_name")]
DefaultName(#[metrics(flatten)] NestedMetrics),
}
#[test]
fn test_variant_name_override() {
let variant = VariantNameOverride::DefaultName(NestedMetrics { value: 99 });
let name: &'static str = (&variant).into();
assert_eq!(name, "custom_name");
assert_eq!(variant.as_sample_group(), "custom_name");
let entry = test_metric(variant);
assert_eq!(entry.metrics["value"], 99);
}
#[metrics(rename_all = "kebab-case")]
enum VariantNameWithRenameAll {
#[metrics(name = "custom_variant")]
DefaultVariant(#[metrics(flatten)] NestedMetrics),
}
#[test]
fn test_variant_name_with_rename_all() {
let variant = VariantNameWithRenameAll::DefaultVariant(NestedMetrics { value: 88 });
let name: &'static str = (&variant).into();
assert_eq!(name, "custom_variant");
assert_eq!(variant.as_sample_group(), "custom_variant");
let entry = test_metric(variant);
assert_eq!(entry.metrics["value"], 88);
}
#[metrics(prefix = "api_")]
enum VariantNameWithPrefix {
#[metrics(name = "operation")]
DefaultOp(#[metrics(flatten)] NestedMetrics),
TupleOp(#[metrics(flatten)] NestedMetrics),
StructOp {
count: u32,
},
}
#[test]
fn test_variant_name_with_prefix() {
let variant = VariantNameWithPrefix::DefaultOp(NestedMetrics { value: 77 });
let name: &'static str = (&variant).into();
assert_eq!(name, "operation");
assert_eq!(variant.as_sample_group(), "operation");
let entry = test_metric(variant);
assert_eq!(entry.metrics["value"], 77);
let variant2 = VariantNameWithPrefix::TupleOp(NestedMetrics { value: 88 });
let name2: &'static str = (&variant2).into();
assert_eq!(name2, "TupleOp");
assert_eq!(variant2.as_sample_group(), "TupleOp");
let entry2 = test_metric(variant2);
assert_eq!(entry2.metrics["value"], 88);
let variant3 = VariantNameWithPrefix::StructOp { count: 99 };
let name3: &'static str = (&variant3).into();
assert_eq!(name3, "StructOp");
assert_eq!(variant3.as_sample_group(), "StructOp");
let entry3 = test_metric(variant3);
assert_eq!(entry3.metrics["api_count"], 99); }
#[metrics]
enum StructFieldName {
Variant {
#[metrics(name = "custom_field")]
default_field: u32,
},
}
#[test]
fn test_struct_field_name() {
let entry = test_metric(StructFieldName::Variant { default_field: 123 });
assert_eq!(entry.metrics["custom_field"], 123);
}
#[metrics]
enum StructFieldUnit {
Variant {
#[metrics(unit = unit::Millisecond)]
latency: u64,
},
}
#[test]
fn test_struct_field_unit() {
let entry = test_metric(StructFieldUnit::Variant { latency: 150 });
assert_eq!(entry.metrics["latency"], 150);
assert_eq!(
entry.metrics["latency"].unit,
unit::Unit::Second(unit::NegativeScale::Milli)
);
}
#[metrics]
enum StructFieldFormat {
Variant {
#[metrics(format = ToString)]
name: u32,
},
}
#[test]
fn test_struct_field_format() {
let entry = test_metric(StructFieldFormat::Variant { name: 42 });
assert_eq!(entry.values["name"], "42");
}
#[metrics]
enum TupleStringConversion {
#[metrics(name = "custom_op")]
Operation(#[metrics(flatten)] NestedMetrics),
DefaultName(#[metrics(flatten)] NestedMetrics),
}
#[test]
fn test_tuple_variant_string_conversion() {
let op = TupleStringConversion::Operation(NestedMetrics { value: 1 });
let default = TupleStringConversion::DefaultName(NestedMetrics { value: 2 });
let op_str: &'static str = (&op).into();
let default_str: &'static str = (&default).into();
assert_eq!(op_str, "custom_op");
assert_eq!(default_str, "DefaultName");
assert_eq!(op.as_sample_group(), "custom_op");
assert_eq!(default.as_sample_group(), "DefaultName");
}
#[metrics(rename_all = "kebab-case")]
enum StructStringConversion {
#[metrics(name = "custom_variant")]
DefaultVariant {
field: u32,
},
AnotherVariant {
field: u32,
},
}
#[test]
fn test_struct_variant_string_conversion() {
let custom = StructStringConversion::DefaultVariant { field: 1 };
let another = StructStringConversion::AnotherVariant { field: 2 };
let custom_str: &'static str = (&custom).into();
let another_str: &'static str = (&another).into();
assert_eq!(custom_str, "custom_variant");
assert_eq!(another_str, "another-variant");
assert_eq!(custom.as_sample_group(), "custom_variant");
assert_eq!(another.as_sample_group(), "another-variant");
}
#[metrics]
enum MultiFieldTuple {
Variant(
#[metrics(flatten, prefix = "a_")] NestedMetrics,
#[metrics(ignore)] u32,
#[metrics(flatten, prefix = "b_")] NestedMetrics,
#[metrics(ignore)] String,
),
}
#[test]
fn test_multi_field_tuple_variant() {
let entry = test_metric(MultiFieldTuple::Variant(
NestedMetrics { value: 10 },
999,
NestedMetrics { value: 20 },
"ignored".to_string(),
));
assert_eq!(entry.metrics["a_value"], 10);
assert_eq!(entry.metrics["b_value"], 20);
assert!(!entry.metrics.contains_key("999"));
assert!(!entry.values.contains_key("ignored"));
}