Derive Macro xylem::Xylem [−][src]
#[derive(Xylem)]
{
// Attributes available to this derive:
#[xylem]
}
Expand description
Derives a Xylem implementation for a struct or enum
and the corresponding Xylem::From type.
In this page, “input” refers to the struct/enum written by the user manually,
and “derived” refers to the struct/enum generated by the macro
to be used as the Xylem::From type.
The derived type has the same structure as the input type
with each field type Type replaced by <Type as Xylem<S>>::From,
except otherwise specified by the field attributes.
Conversion takes place by mapping each field of the derived type
to the corresponding field of the input type
by calling Xylem::convert.
Container Attributes
The following attributes can be applied on the input.
#[xylem(expose = Ident)]
Expose the derived type with the specified name Ident.
The type has the same visibility as the input type.
#[xylem(schema = path::to::Schema)]
Specify the schema type to define for as path::to::Schema.
#[xylem(serde(xxx))]
Apply the serde attribute xxx to the derived type.
#[xylem(derive(Foo, Bar))]
Apply the derive macros Foo, Bar on the derived type.
#[xylem(process)]
Call Processable::preprocess before conversion,
call Processable::postprocess after conversion.
Requires the input type to implement the Processable trait.
Field Attributes
The following attributes can be applied on the fields in the input.
As above, “input field” refers to the field written by the user manually,
and “derived field” refers to the field generated by the macro
that occur in the derived type.
Furthermore, the following assumes that
the attribute is applied on foo: Bar unless otherwise specified.
#[xylem(serde(xxx))]
Apply the serde attribute xxx to the derived field.
#[xylem(preserve)]:
The derived field will use the same type as the input field,
i.e. #[xylem(preserve)] foo: Bar generats foo: Bar in the derived type.
The value in the derived field is directly moved to the target field.
#[xylem(transform = path(Type))]
Generate a field foo: Type in the derived type,
and call path(derived.foo) during conversion.
path is the path to a function with the signature
fn(Type) -> Result<Bar, S::Error>.
For example, #[xylem(transform = Ok(Type))]
is equivalent to #[xylem(preserve)].
#[xylem(transform_with_context = path(Type))]
Similar to transform, except path accepts an extra context parameter,
giving the signature fn(Type, &mut S::Context) -> Result<Field, S::Error>.
#[xylem(default = expr)]
Always uses expr (resolved every time the struct
or the enum variant is constructed) as the value.
Does not generate a field in the From type.
The expression should have type Result<Field, S::Error>,
where Field is the field type.
Comparing default, preserve, transform and transform_with_context:
- If a corresponding field is required in the derived type,
- If they have different types,
- If context is required, use
transform_with_context. - Otherwise, use
transform.
- If context is required, use
- Otherwise, use
preserve.
- If they have different types,
- Otherwise, use
default.
#[xylem(args(key1 = value1, key2 = value2))]
Pass the given arguments in the Xylem::convert call.
Incompatible with default, preserve, transform and transform_with_context.
key1 and key2 are visible named fields in <Bar as Xylem<S>>::Args.
The values in the key are evaluated lazily and stored as a static.
The generated code is equivalent to the following:
lazy_static! {
static ref ARGS: Args = Args {
key1: value1,
key2: value2,
};
}
<Bar as Xylem<S>>::convert(derived.foo, context, &*ARGS)