#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

#1647 in Procedural macros

Download history 9/week @ 2024-01-14 12/week @ 2024-01-21 38/week @ 2024-01-28 28/week @ 2024-02-04 134/week @ 2024-02-11 44/week @ 2024-02-18 122/week @ 2024-02-25 19/week @ 2024-03-03 17/week @ 2024-03-10 46/week @ 2024-03-17 45/week @ 2024-03-24 46/week @ 2024-03-31

155 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

~0.4–0.8MB
~19K SLoC