@@ -44,10 +44,10 @@ impl<P: Atomic> GenericCounter<P> {
4444
4545 /// Create a [`GenericCounter`] with the `opts` options.
4646 pub fn with_opts ( opts : Opts ) -> Result < Self > {
47- Self :: with_opts_and_label_values ( & opts, & [ ] )
47+ Self :: with_opts_and_label_values :: < & str > ( & opts, & [ ] )
4848 }
4949
50- fn with_opts_and_label_values ( opts : & Opts , label_values : & [ & str ] ) -> Result < Self > {
50+ fn with_opts_and_label_values < V : AsRef < str > > ( opts : & Opts , label_values : & [ V ] ) -> Result < Self > {
5151 let v = Value :: new ( opts, ValueType :: Counter , P :: T :: from_i64 ( 0 ) , label_values) ?;
5252 Ok ( Self { v : Arc :: new ( v) } )
5353 }
@@ -126,7 +126,7 @@ impl<P: Atomic> MetricVecBuilder for CounterVecBuilder<P> {
126126 type M = GenericCounter < P > ;
127127 type P = Opts ;
128128
129- fn build ( & self , opts : & Opts , vals : & [ & str ] ) -> Result < Self :: M > {
129+ fn build < V : AsRef < str > > ( & self , opts : & Opts , vals : & [ V ] ) -> Result < Self :: M > {
130130 Self :: M :: with_opts_and_label_values ( opts, vals)
131131 }
132132}
@@ -452,6 +452,40 @@ mod tests {
452452 assert ! ( vec. remove( & labels3) . is_err( ) ) ;
453453 }
454454
455+ #[ test]
456+ fn test_counter_vec_with_owned_labels ( ) {
457+ let vec = CounterVec :: new (
458+ Opts :: new ( "test_couter_vec" , "test counter vec help" ) ,
459+ & [ "l1" , "l2" ] ,
460+ )
461+ . unwrap ( ) ;
462+
463+ let v1 = "v1" . to_string ( ) ;
464+ let v2 = "v2" . to_string ( ) ;
465+
466+ let mut labels = HashMap :: new ( ) ;
467+ labels. insert ( "l1" , v1. clone ( ) ) ;
468+ labels. insert ( "l2" , v2. clone ( ) ) ;
469+ assert ! ( vec. remove( & labels) . is_err( ) ) ;
470+
471+ vec. with ( & labels) . inc ( ) ;
472+ assert ! ( vec. remove( & labels) . is_ok( ) ) ;
473+ assert ! ( vec. remove( & labels) . is_err( ) ) ;
474+
475+ let mut labels2 = HashMap :: new ( ) ;
476+ labels2. insert ( "l1" , v2. clone ( ) ) ;
477+ labels2. insert ( "l2" , v1. clone ( ) ) ;
478+
479+ vec. with ( & labels) . inc ( ) ;
480+ assert ! ( vec. remove( & labels2) . is_err( ) ) ;
481+
482+ vec. with ( & labels) . inc ( ) ;
483+
484+ let mut labels3 = HashMap :: new ( ) ;
485+ labels3. insert ( "l1" , v1. clone ( ) ) ;
486+ assert ! ( vec. remove( & labels3) . is_err( ) ) ;
487+ }
488+
455489 #[ test]
456490 fn test_int_counter_vec ( ) {
457491 let vec = IntCounterVec :: new ( Opts :: new ( "foo" , "bar" ) , & [ "l1" , "l2" ] ) . unwrap ( ) ;
@@ -491,6 +525,27 @@ mod tests {
491525 assert ! ( vec. remove_label_values( & [ "v1" , "v3" ] ) . is_err( ) ) ;
492526 }
493527
528+ #[ test]
529+ fn test_counter_vec_with_owned_label_values ( ) {
530+ let vec = CounterVec :: new (
531+ Opts :: new ( "test_vec" , "test counter vec help" ) ,
532+ & [ "l1" , "l2" ] ,
533+ )
534+ . unwrap ( ) ;
535+
536+ let v1 = "v1" . to_string ( ) ;
537+ let v2 = "v2" . to_string ( ) ;
538+ let v3 = "v3" . to_string ( ) ;
539+
540+ assert ! ( vec. remove_label_values( & [ v1. clone( ) , v2. clone( ) ] ) . is_err( ) ) ;
541+ vec. with_label_values ( & [ v1. clone ( ) , v2. clone ( ) ] ) . inc ( ) ;
542+ assert ! ( vec. remove_label_values( & [ v1. clone( ) , v2. clone( ) ] ) . is_ok( ) ) ;
543+
544+ vec. with_label_values ( & [ v1. clone ( ) , v2. clone ( ) ] ) . inc ( ) ;
545+ assert ! ( vec. remove_label_values( & [ v1. clone( ) ] ) . is_err( ) ) ;
546+ assert ! ( vec. remove_label_values( & [ v1. clone( ) , v3. clone( ) ] ) . is_err( ) ) ;
547+ }
548+
494549 #[ test]
495550 fn test_counter_vec_local ( ) {
496551 let vec = CounterVec :: new (
0 commit comments