Skip to content

Commit 073ec36

Browse files
committed
fix(derive-encode): keep struct's generic parameters while deriving EncodeLabelSet
Signed-off-by: ADD-SP <[email protected]>
1 parent adc7c4e commit 073ec36

File tree

4 files changed

+31
-3
lines changed

4 files changed

+31
-3
lines changed

CHANGELOG.md

+9-1
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,22 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1414
- `Family::get_or_create_owned` can access a metric in a labeled family. This
1515
method avoids the risk of runtime deadlocks at the expense of creating an
1616
owned type. See [PR 244].
17-
17+
1818
[PR 244]: https://github.com/prometheus/client_rust/pull/244
1919
[PR 257]: https://github.com/prometheus/client_rust/pull/257
2020

2121
### Changed
2222

2323
- `EncodeLabelSet::encode()` now accepts a mutable reference to its encoder parameter.
2424

25+
### Fixed
26+
27+
- Fixed an issue where derive macros `EncodeLabelSet` didn't work
28+
when the `struct` has generic parameters (like `'a`).
29+
See [PR 266].
30+
31+
[PR 266]: https://github.com/prometheus/client_rust/pull/266
32+
2533
## [0.23.1]
2634

2735
### Changed

derive-encode/src/lib.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,9 @@ pub fn derive_encode_label_set(input: TokenStream) -> TokenStream {
7070
syn::Data::Union(_) => panic!("Can not derive Encode for union."),
7171
};
7272

73+
let (impl_generics, ty_generics, where_clause) = ast.generics.split_for_impl();
7374
let gen = quote! {
74-
impl ::prometheus_client::encoding::EncodeLabelSet for #name {
75+
impl #impl_generics ::prometheus_client::encoding::EncodeLabelSet for #name #ty_generics #where_clause {
7576
fn encode(&self, encoder: &mut ::prometheus_client::encoding::LabelSetEncoder) -> ::core::result::Result<(), ::core::fmt::Error> {
7677
use ::prometheus_client::encoding::EncodeLabel;
7778
use ::prometheus_client::encoding::EncodeLabelKey;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
use prometheus_client::encoding::EncodeLabelSet;
2+
use prometheus_client::encoding::EncodeLabelValue;
3+
4+
#[derive(Debug, Clone, PartialEq, Eq, Hash, EncodeLabelValue)]
5+
enum CpuUsageLabelMode {
6+
User,
7+
System,
8+
Irq,
9+
}
10+
11+
#[derive(Debug, Clone, PartialEq, Eq, Hash, EncodeLabelSet)]
12+
struct CpuUsageLabelSet<'a> { // <-- `'a` lifetime is used in the struct,
13+
// this should be preserved in the impl block
14+
mode: CpuUsageLabelMode,
15+
service: &'a str
16+
}
17+
18+
fn main() {}

derive-encode/tests/lib.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -209,5 +209,6 @@ fn flatten() {
209209
#[test]
210210
fn build() {
211211
let t = trybuild::TestCases::new();
212-
t.pass("tests/build/redefine-prelude-symbols.rs")
212+
t.pass("tests/build/redefine-prelude-symbols.rs");
213+
t.pass("tests/build/keep-impl-generics.rs");
213214
}

0 commit comments

Comments
 (0)