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.
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
The minimum supported Rust version is 1.60.0.