@@ -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}
@@ -450,6 +450,40 @@ mod tests {
450450 assert ! ( vec. remove( & labels3) . is_err( ) ) ;
451451 }
452452
453+ #[ test]
454+ fn test_counter_vec_with_owned_labels ( ) {
455+ let vec = CounterVec :: new (
456+ Opts :: new ( "test_couter_vec" , "test counter vec help" ) ,
457+ & [ "l1" , "l2" ] ,
458+ )
459+ . unwrap ( ) ;
460+
461+ let v1 = "v1" . to_string ( ) ;
462+ let v2 = "v2" . to_string ( ) ;
463+
464+ let mut labels = HashMap :: new ( ) ;
465+ labels. insert ( "l1" , v1. clone ( ) ) ;
466+ labels. insert ( "l2" , v2. clone ( ) ) ;
467+ assert ! ( vec. remove( & labels) . is_err( ) ) ;
468+
469+ vec. with ( & labels) . inc ( ) ;
470+ assert ! ( vec. remove( & labels) . is_ok( ) ) ;
471+ assert ! ( vec. remove( & labels) . is_err( ) ) ;
472+
473+ let mut labels2 = HashMap :: new ( ) ;
474+ labels2. insert ( "l1" , v2. clone ( ) ) ;
475+ labels2. insert ( "l2" , v1. clone ( ) ) ;
476+
477+ vec. with ( & labels) . inc ( ) ;
478+ assert ! ( vec. remove( & labels2) . is_err( ) ) ;
479+
480+ vec. with ( & labels) . inc ( ) ;
481+
482+ let mut labels3 = HashMap :: new ( ) ;
483+ labels3. insert ( "l1" , v1. clone ( ) ) ;
484+ assert ! ( vec. remove( & labels3) . is_err( ) ) ;
485+ }
486+
453487 #[ test]
454488 fn test_int_counter_vec ( ) {
455489 let vec = IntCounterVec :: new ( Opts :: new ( "foo" , "bar" ) , & [ "l1" , "l2" ] ) . unwrap ( ) ;
@@ -489,6 +523,27 @@ mod tests {
489523 assert ! ( vec. remove_label_values( & [ "v1" , "v3" ] ) . is_err( ) ) ;
490524 }
491525
526+ #[ test]
527+ fn test_counter_vec_with_owned_label_values ( ) {
528+ let vec = CounterVec :: new (
529+ Opts :: new ( "test_vec" , "test counter vec help" ) ,
530+ & [ "l1" , "l2" ] ,
531+ )
532+ . unwrap ( ) ;
533+
534+ let v1 = "v1" . to_string ( ) ;
535+ let v2 = "v2" . to_string ( ) ;
536+ let v3 = "v3" . to_string ( ) ;
537+
538+ assert ! ( vec. remove_label_values( & [ v1. clone( ) , v2. clone( ) ] ) . is_err( ) ) ;
539+ vec. with_label_values ( & [ v1. clone ( ) , v2. clone ( ) ] ) . inc ( ) ;
540+ assert ! ( vec. remove_label_values( & [ v1. clone( ) , v2. clone( ) ] ) . is_ok( ) ) ;
541+
542+ vec. with_label_values ( & [ v1. clone ( ) , v2. clone ( ) ] ) . inc ( ) ;
543+ assert ! ( vec. remove_label_values( & [ v1. clone( ) ] ) . is_err( ) ) ;
544+ assert ! ( vec. remove_label_values( & [ v1. clone( ) , v3. clone( ) ] ) . is_err( ) ) ;
545+ }
546+
492547 #[ test]
493548 fn test_counter_vec_local ( ) {
494549 let vec = CounterVec :: new (
0 commit comments