#transitive #macro #rust

macro transitive

Transitive derive macros for Rust

10 releases (3 stable)

1.1.0 Mar 13, 2025
1.0.1 May 2, 2024
0.5.0 Jul 3, 2023
0.4.3 Mar 9, 2023
0.1.1 Feb 21, 2023

#804 in Rust patterns

Download history 607/week @ 2025-01-15 493/week @ 2025-01-22 550/week @ 2025-01-29 624/week @ 2025-02-05 852/week @ 2025-02-12 658/week @ 2025-02-19 793/week @ 2025-02-26 665/week @ 2025-03-05 725/week @ 2025-03-12 637/week @ 2025-03-19 407/week @ 2025-03-26 677/week @ 2025-04-02 487/week @ 2025-04-09 757/week @ 2025-04-16 679/week @ 2025-04-23 472/week @ 2025-04-30

2,551 downloads per month

MIT license

23KB
347 lines

Crates.io

transitive

Transitive converions through derive macros for Rust.

Rationale:

Assume you have types A, B and C with the following, already implemented, conversions:

  • A -> B
  • B -> C

Sometimes it might be desirable to have an A -> C implementation which could easily be represented as A -> B -> C.

That is precisely what this crate does. Through the Transitive derive macro, it will implement From or TryFrom respectively for converting from/to the derived type and a target type, given a path of transitions to go through.

use transitive::Transitive;

#[derive(Transitive)]
#[transitive(into(B, C, D))] // impl From<A> for D by doing A -> B -> C -> D
struct A;

#[derive(Transitive)]
#[transitive(into(C, D))] // impl From<B> for D by doing B -> C -> D
struct B;
struct C;
struct D;

impl From<A> for B {
    fn from(val: A) -> Self {
        Self
    }
};

impl From<B> for C {
    fn from(val: B) -> Self {
        Self
    }
};

impl From<C> for D {
    fn from(val: C) -> Self {
        Self
    }
};

#[test]
fn into() {
    D::from(A);
    D::from(B);
}

More examples and explanations can be found in the documentation.

License

Licensed under MIT license (LICENSE-MIT or https://opensource.org/licenses/MIT).

Contributing

Contributions to this repository, unless explicitly stated otherwise, will be considered licensed under MIT. Bugs/issues encountered can be opened here.

Dependencies

~165–580KB
~14K SLoC