#macro-derive #proc-macro #convert #struct #generate #try #target

macro derive-try-from-ref

A derive macro to generate TryFrom<&T> implementation

1 unstable release

0.1.0 Jan 17, 2024

#61 in #try

Download history 65/week @ 2024-06-24 18/week @ 2024-07-01 1/week @ 2024-07-15 25/week @ 2024-07-22 75/week @ 2024-07-29 54/week @ 2024-08-05 32/week @ 2024-08-12 27/week @ 2024-08-26 3/week @ 2024-09-09 26/week @ 2024-09-16 28/week @ 2024-09-23 10/week @ 2024-09-30 43/week @ 2024-10-07

107 downloads per month
Used in 3 crates (via odra-macros)

MIT license

16KB
230 lines

Crates.io License: MIT

Description

This crate provides a proc macro to implement TryFrom<&Struct> for a target struct. It helps to convert a bigger struct to a few smaller, more specialized structs. The macro expands to a TryFrom implementation that tries to convert each field of the target struct from the whole source struct. If the conversion fails, the macro returns an error.

Usage

use try_from_ref::TryFromRef;

struct Source {
    x: u32,
    y: u32,
    name: String,
    description: String,
}

#[derive(derive_try_from::TryFromRef)]
#[source(Source)]
#[err(&'static str)]
struct Target {
    sum: Sum,
    meta: Metadata,
    #[default]
    is_dirty: bool,
}

expands to

#[automatically_derived]
impl ::core::convert::TryFrom<&'_ Source> for Target {
    type Error = &'static str;
    fn try_from(input: &'_ Source) -> ::core::result::Result<Self, Self::Error> {
        Ok(Self {
            sum: input.try_into()?,
            meta: input.try_into()?,
            is_dirty: Default::default(),
        })
    }
}

At the struct level, two attributes are required:

  • #[source(SourceType)] - the name of the source struct
  • #[err(ErrorType)] - the error type to return if the conversion fails

At the field level, another two attributes are supported:

  • #[default] - skips conversion, sets the default value of the type instead
  • #[expr(expression)] - the expression to evaluate to get the value of the field

MSRV (Minimum Supported Rust Version)

The minimum supported Rust version is 1.60.0.

Dependencies

~290–740KB
~17K SLoC