Open
Description
Currently when deriving EncodeLabelSet
and flattening a struct the flattened struct must appear last, and there must be only one flattened struct, from the test:
#[test]
fn flatten() {
#[derive(EncodeLabelSet, Hash, Clone, Eq, PartialEq, Debug)]
struct CommonLabels {
a: u64,
b: u64,
}
#[derive(EncodeLabelSet, Hash, Clone, Eq, PartialEq, Debug)]
struct Labels {
unique: u64,
#[prometheus(flatten)]
common: CommonLabels,
}
// …
If you place common
before unique
in struct Labels
like this:
#[derive(EncodeLabelSet, Hash, Clone, Eq, PartialEq, Debug)]
struct Labels {
#[prometheus(flatten)]
common: CommonLabels,
unique: u64,
}
Compilation fails:
error[E0382]: borrow of moved value: `encoder`
--> derive-encode/tests/lib.rs:147:14
|
147 | #[derive(EncodeLabelSet, Hash, Clone, Eq, PartialEq, Debug)]
| ^^^^^^^^^^^^^^
| |
| value borrowed here after move
| move occurs because `encoder` has type `LabelSetEncoder<'_>`, which does not implement the `Copy` trait
|
This occurs because ownership of encoder
is given to the flattened struct
I think this would be a breaking change to fix, but fixing it would allow fields to appear in any order, or allow flattening of multiple structs without nesting them all one inside the other in tail position.