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.
Currently when deriving
EncodeLabelSetand flattening a struct the flattened struct must appear last, and there must be only one flattened struct, from the test:If you place
commonbeforeuniqueinstruct Labelslike this:Compilation fails:
This occurs because ownership of
encoderis given to the flattened structI 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.