#named-fields #mapping #convert #derive #traits-structs #map #from

structural-convert

Derive conversion traits (From, Into, TryFrom, TryInto) when fields are structurally similar in enums or structs

17 releases (breaking)

0.13.0 Mar 11, 2024
0.11.0 Mar 10, 2024

#1424 in Rust patterns

Download history 805/week @ 2024-10-25 1777/week @ 2024-11-01 1701/week @ 2024-11-08 717/week @ 2024-11-15 446/week @ 2024-11-22 506/week @ 2024-11-29 536/week @ 2024-12-06 781/week @ 2024-12-13 459/week @ 2024-12-20 163/week @ 2024-12-27 502/week @ 2025-01-03 783/week @ 2025-01-10 1043/week @ 2025-01-17 953/week @ 2025-01-24 642/week @ 2025-01-31 949/week @ 2025-02-07

3,748 downloads per month

MIT license

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 to Option<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
~45K SLoC

pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy