17 releases (breaking)
0.13.0 | Mar 11, 2024 |
---|---|
0.11.0 | Mar 10, 2024 |
#629 in Rust patterns
6,322 downloads per month
21KB
327 lines
structural-convert
Derive conversion traits when items are structurally similar.
Inspired by serde and struct-convert crates.
Features
- One to one fields mapping derive for
- From
- Into
- TryFrom
- TryInto
- Inner fields type conversion using
.into()
/.try_into()
- Rename enum variants and named fields
- Skip enum variants and named fields
- Fallback to default enum variant
- Named fields conversion fallback to default
- Enum not matched variants fallback to enum default
- Struct named fields only - Middle man type conversion using
as
attribute - handles std types:
Option
Result
- types from
std::collections
like Vec, HashMap, etc...
Features Wishlist
- Implement attributes for unnamed fields (default, skip, as)
- Handle
Type
toOption<Type>
- Add more data on try error and provide ability to inject your own error type
Examples
Check the tests folder for more examples, but here is some samples:
Struct
#[derive(Debug, PartialEq)]
struct Rhs {
z: i8,
x: u32,
}
#[derive(Debug, PartialEq, StructuralConvert)]
#[convert(from(Rhs))]
struct Lhs {
z: i32,
x: u32,
}
assert_eq!(Lhs { z: 1, x: 2 }, Rhs { z: 1, x: 2 }.into());
assert_eq!(Lhs { z: 1, x: 2 }, Rhs { z: 1, x: 2 }.into());
Generated code:
impl From<Rhs> for Lhs {
fn from(value: Rhs) -> Self {
match value {
Rhs { z, x } => Lhs {
z: z.into(),
x: x.into(),
},
}
}
}
Enum
#[derive(Debug, PartialEq)]
enum Rhs {
A { z: i8, x: u32 },
}
#[derive(Debug, PartialEq, StructuralConvert)]
#[convert(from(Rhs))]
enum Lhs {
A { z: i32, x: u32 },
}
assert_eq!(Lhs::A { z: 1, x: 2 }, Rhs::A { z: 1, x: 2 }.into());
Generated code:
impl From<Rhs> for Lhs {
fn from(value: Rhs) -> Self {
match value {
Rhs::A { z, x } => Lhs::A {
z: z.into(),
x: x.into(),
},
}
}
}
Dependencies
~2MB
~44K SLoC