build-deftly
This crate is a project to test the derive-deftly macro system
by attempting to clone the derive_builder crate.
As it stands, I think I have gotten an implementation for every feature that
derive_builder has, but in some cases I had to give them a different syntax.
I have not tested every combination of features; probably some combinations
will break.
Converting to use this crate.
Instead of this...
use Builder;
Say this:
use Deftly;
use *;
If you use any #[builder(...)] options,
you will have to change them to #[deftly(builder(...))] instead.
Some options have a different form; see below.
Supported options
So far, these options are supported.
(Remember, they go inside #[deftly(builder(...))].)
-
pattern = "PAT"— Supported on fields and structs.PATcan beimmutable,owned, ormutable(the default). -
setter(skip),setter(custom)— Supported on fields and structs. Note that we do not supportskip=true,skip=false,custom=true, orcustom=false. Instead ofskip=true, sayskip. Instead ofcustom=true, saycustom. Instead ofskip=falseorcustom=false, say "enabled", as insetter(enabled). (See derive-deftly#40, derive-deftly#48, derive-deftly#49.) -
vis = "VISIBILITY"— Supported on fields and structs. By default, builders and setters have the same visibility as the original struct. To override this on the builder and its methods, say (for example)vis="pub"orvis="pub(crate). This replacesderive_builder'spublicandprivateoptions. -
name = "NAME"— Supported on structs. Renames the generated builder structure and error enum. -
setter(prefix = "PREFIX")— Supported on fields and structs. Adds a prefix (with an underscore) to setter methods. -
setter(name = "PREFIX")— Supported on fields. Rename a single setter method. -
setter(into)— Supported on fields. Makes a setter generic overV:Into<..>. -
setter(try_into)— Supported on fields. Makes a setter generic overV:TryInto<..>. -
setter(try_into)— Supported on fields of typeOption<T>. Makes a setter take aTinstead of anOption<T>. (When used withinto, makes the setter takeimpl Into<T>instead ofimpl Into<Option<T>>; behaves analogously with try_into.) -
default,default_val = "EXPR"— Supported on fields. Unlikederive_builder, these are separate options, sincederive_deftlydoesn't support options with optional values. (See see derive-deftly#40, derive-deftly#48.) -
build_fn(skip)— Supported on structs. Skips generation of thebuild()function. -
build_fn(name = "NAME")— Supported on structs. Provides a new name for thebuild()function. -
build_fn(validate = "PATH")— Supported on structs. Provides a function to run before the rest of the builder, to validate its inputs. The function must take the Builder by reference, and returnResult<_, String>. -
build_fn(error = "NAME")— Supported on structs. Provides a user-supplied error type. It must implementFrom<UninitializedFieldError>. -
derive = "TYPES"— Supported on structs. Causes the generated Builder to derive the provided list of comma-separated types. Unlike derive_builder, this must be a string. (See derive-deftly#56.) -
struct_attr = "ATTRS",impl_attr = "ATTRS"— Supported on structs. Declares one or more attributes that should be applied verbatim to the builder or to itsimplblock. These need to include the full attribute syntax, as instruct_attr = "#[must_use]". (This differs fromderive_builderin its name and syntax; see derive-deftly#56.) -
field_attr = "ATTRS",setter_attr = "ATTRS"— Supported on fields. Declares one or more attributes that should be applied verbatim to the field in the builder, or to its setter function. These need to include the full attribute syntax, as infield_attr = "#[serde(default)]"). (This differs fromderive_builderin its name and syntax; see derive-deftly#56.) -
field(ty)— Supported on fields. Overrides the type of the field as stored in the builder. -
field(build_fn),field(try_build_fn)— Supported on fields. Overrides the code used to generate the field from the field stored in the builder. These options take an expression that must evaluate to a function on &self. Thebuild_fnvariant should return the type of the field as it appears in the underlying struct; Thetry_build_fnshould return aResult. (This differs fromderive_builderin its name and syntax; see derive-deftly#55.) -
sub_builder,sub_builder(fn_name)— Supported on fields. Behaves as inderive-deftly-fork-arti.
Additional features
We add a Self::builder() method to your original type
that returns an empty builder.