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

macro derive-try-from-ref

A derive macro to generate TryFrom<&T> implementation

1 unstable release

0.1.0 Jan 17, 2024

#74 in #try

Download history 12/week @ 2024-11-13 43/week @ 2024-11-20 40/week @ 2024-11-27 24/week @ 2024-12-04 33/week @ 2024-12-11 10/week @ 2024-12-18 9/week @ 2025-01-01 5/week @ 2025-01-08 2/week @ 2025-01-15 4/week @ 2025-01-22 6/week @ 2025-01-29 23/week @ 2025-02-05 9/week @ 2025-02-12 22/week @ 2025-02-19 50/week @ 2025-02-26

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

MIT license

16KB
249 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

~255–700KB
~16K SLoC