# Changelog
All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
## [Unreleased]
### Fixed
- Also add the licenses to the macro crate.
## 0.18.1 - 2024-01-17
### Fixed
- Add `#[allow(clippy::no_effect_underscore_binding)]` to generated methods
that need to destructure intermediate builder state.
- Use a proper `OR` syntax for the dual license.
## 0.18.0 - 2023-10-19
### Fixed
- `?Sized` generic parameters are now supported.
## 0.17.0 - 2023-10-15
### Changed
- Internal refactor of attribute parsing - results in better error messages and
easier proces for adding new settings.
### Added
- `#[builder(mutators(...))]` to generate functions on builder to mutate fields
- `#[builder(via_mutator)]` on fields to allow defining fields initialized
during `::builder()` for use with `mutators`
- `mutable_during_default_resolution` to allow `default` expression mutate
previous fields.
### Fixed
- Add support for paths with angle brackets (see PR #122 )
## 0.16.2 - 2023-09-22
### Fixed
- Use generics with the constructor in `build` method (see issue #118)
## 0.16.1 - 2023-09-18
### Fixed
- Add `#[allow(clippy::exhaustive_enums)]` to generated empty enums used for
error "reporting" (see issue #112)
- Add `#[automatically_derived]` to generated `impl`s (see issue #114)
- Add `#[allow(clippy::used_underscore_binding)]` to build method and setter
methods (see issue #113)
## 0.16.0 - 2023-08-26
### Added
- `#[builder(crate_module_path = ...)]` for overcoming cases where the derive
macro is used in another crate's macro (see issue #109)
## 0.15.2 - 2023-08-03
### Fixed
- Fix const generics generating "empty" entries in some lists, resulting in
consecutive commas (see issue #106)
## 0.15.1 - 2023-07-10
### Fixed
- no-std build.
## 0.15.0 - 2023-07-06
### Changed
- [**BREAKING**] Split the derive macro out to [a separate procmacro
crate](https://crates.io/crates/typed-builder-macro). This is considered a
breaking change because reexporting and/or renmaing the crate can now prevent
the generated code from finding the types it needs (see issue #101)
### Fixed
- Marking a field as `#[deprecated]` now behaves properly - `TypedBuilder`
generated code itself does trigger the deprecation warning, and instead the
setter for that field now does.
- The "fake" `build` method when required fields are not provided now returns
the never type ("`!`"). Refer to PR #97 for more thorough explanation.
### Added
- Support for setter method prefixes and suffixes `#[builder(field_defaults(setter(prefix = "...", suffix = "...")))]`.
This either prepends or appends the provided string to the setter method. This allows method names like: `set_x()`,
`with_y()`, or `set_z_value()`.
## 0.14.0 - 2023-03-08
### Added
- `build_method(into)` and `build_method(into = ...)`.
## 0.13.0 - 2023-03-05
### Changed
y
- [**BREAKING**] Builder state parameter moved to the end of the generated builder type's parameters list.
- Generated builder type's builder state parameter now defaults to tuple of
empty tuples. This means the empty builder, where no parameter is yet set.
### Fixed
- `#[builder(build_method(...))]` now affects the fake `build` method that's
generated to add information to the compiler error.
## 0.12.0 - 2023-01-29
### Removed
- [**BREAKING**] `builder_method_doc = "..."`, `builder_type_doc = "..."` and
`build_method_doc = "..."` are replaced with `builder_method(doc = "...")`,
`builder_type(doc = "...")` and `build_method(doc = "...")`.
### Added
- `build_method(...)` now has a `doc` field.
- `builder_method(...)` and `builder_type(...)`, which are structured similarly to `build_method(...)`.
## 0.11.0 - 2022-10-29
### Added
- `#[builder(build_method(vis="pub", name=build))]` for customizing visibility and fn name of the final build method
(the default visibility is `pub`, and default build name is `build`)
## 0.10.0 - 2022-02-13
### Added
- `#[builder(setter(strip_bool))]` for making zero arguments setters for `bool` fields that just
set them to `true` (the `default` automatically becomes `false`)
## 0.9.1 - 2021-09-04
### Fixed
- Add `extern crate proc_macro;` to solve some weird problem (https://github.com/idanarye/rust-typed-builder/issues/57)
- Use unambiguous `::` prefixed absolute paths in generated code.
## 0.9.0 - 2021-01-31
### Added
- Builder type implements `Clone` when all set fields support clone.
- `#[builder(setter(transform = ...))]` attribute for running a transform on a
setter's argument to convert them to the field's type.
### Fixed
- Fix code generation for raw identifiers.
## 0.8.0 - 2020-12-06
### Changed
- Upgraded the Rust edition to 2018.
### Added
- `#[field_defaults(...)]` attribute for settings default attributes for all
the fields.
## 0.7.1 - 2020-11-20
### Fixed
- Fix lifetime bounds erroneously preserved in phantom generics.
## 0.7.0 - 2020-07-23
### Added
- Brought back `default_code`, because it needed to resolve conflict with other
custom derive proc-macro crates that try to parse `[#builder(default = ...)]`
attribute in order to decide if they are relevant to them - and fail because
the expect them to be simple literals.
## 0.6.0 - 2020-05-18
### Added
- Ability to use `into` and `strip_option` simultaneously for a field.
### Changed
- [**BREAKING**] Specifying `skip` twice in the same `builder(setter(...))` is
no longer supported. Then again, if you were doing that you probably deserve
having your code broken.
## 0.5.1 - 2020-01-26
### Fixed
- Prevent Clippy from warning about the `panic!()` in the faux build method.
## 0.5.0 - 2020-01-25
### Changed
- [**BREAKING**] Move `doc` and `skip` into a subsetting named `setter(...)`.
This means that `#[builder(doc = "...")]`, for example, should now be written
as `#[builder(setter(doc = "..."))]`.
- [**BREAKING**] Setter arguments by default are no longer automatically
converted to the target type with `into()`. If you want to automatically
convert them, use `#[builder(setter(into))]`. This new default enables rustc
inference for generic types and proper integer literal type detection.
- Improve build errors for incomplete `.build()` and repeated setters, by
creating faux methods with deprecation warnings.
### Added
- `#[builder(setter(strip_option))]` for making setters for `Option` fields
automatically wrap the argument with `Some(...)`. Note that this is a weaker
conversion than `#[builder(setter(into))]`, and thus can still support type
inference and integer literal type detection.
### Removed
- [**BREAKING**] Removed the `default_code` setting (`#[builder(default_code =
"...")]`) because it is no longer required now that Rust and `syn` support
arbitrary expressions in attributes.
## 0.4.1 - 2020-01-17
### Fixed
- [**BREAKING**] now state types are placed before original generic types.
Previously, all state types are appended to generic arguments. For example,
`Foo<'a, X, Y>` yields `FooBuilder<'a, X, Y, ((), ())>` **previously**, and
now it becomes `FooBuilder<'a, ((), ()), X, Y, >.`. This change fix compiler error
for struct with default type like `Foo<'a, X, Y=Bar>`. Rust only allow type
parameters with a default to be trailing.
## 0.4.0 - 2019-12-13
### Added
- `#![no_std]` is now supported out of the box. (You don't need to opt into any
features, it just works.)
- [**BREAKING**] a `default_code` expression can now refer to the values of
earlier fields by name (This is extremely unlikely to break your code, but
could in theory due to shadowing)
- `#[builder(skip)]` on fields, to not provide a method to set that field.
- Control of documentation:
- `#[builder(doc = "…")]` on fields, to document the field's method on the
builder. Unlike `#[doc]`, you can currently only have one value rather than
one attribute per line; but that's not a big deal since you don't get to
use the `///` sugar anyway. Just use a multiline string.
- `#[builder(doc, builder_method_doc = "…", builder_type_doc = "…",
build_method_doc = "…")]` on structs:
- `doc` unhides the builder type from the documentation.
- `builder_method_doc = "…"` replaces the default documentation that
will be generated for the builder() method of the type for which the
builder is being generated.
- `builder_type_doc = "…"` replaces the default documentation that will
be generated for the builder type. Implies `doc`.
- `build_method_doc = "…"` replaces the default documentation that will
be generated for the build() method of the builder type. Implies
`doc`.
### Changed
- [**BREAKING**] Renamed the generated builder type from
`TypedBuilder_BuilderFor_Foo` to `FooBuilder`, for improved ergonomics,
especially when you enable documentation of the builder type.
- Generic identifiers were also changed, from `TypedBuilder_genericType_x` to
`__x`. This is still expected to avoid all name collisions, but is easier
to read in the builder type docs if you enable them.
- Renamed the conversion helper trait for documentation purposes
(`TypedBuilder_conversionHelperTrait_Foo` to `FooBuilder_Optional`), and
its method name for simpler code.
- [**BREAKING**] `default_code` is now lazily evaluated instead of eagerly; any
side-effects that there might have been will no longer occur. As is usual in
this release, this is very unlikely to affect you.
- The restriction that there be only one `#[builder]` attribute per field has
been lifted. You can now write `#[builder(skip)] #[builder(default)]` instead
of `#[builder(skip, default)]` if you want to. As was already the case,
latest definition wins.
- [**BREAKING**] Use a single generic parameter to represent the builder type's
state (see issue #21). Previously we would use a parameter for each field.
### Changed
- Move to dual license - MIT/Apache-2.0. Previously this project was just MIT.
## 0.3.0 - 2019-02-19
### Added
- `#[builder(default_code = "...")]` syntax for defaults that cannot be parsed
as attributes no matter what.
### Changed
- Move the docs from the crate to the custom derive proc macro.
## 0.2.0 - 2019-02-06
### Changed
- Upgraded `syn` version to support Rust 2018.
- [**BREAKING**] Changed attribute style to `#[builder(...)]`:
- `#[default]` -> `#[builder(default)]`
- `#[default=...]` -> `#[builder(default=...)]`
- [**BREAKING**] `default` no longer needs to be a string.
- But you need to change your code anyways because the attribute style was changed.
## 0.1.1 - 2018-07-24
### Fixed
- Allow missing docs in structs that derive `TypedBuilder`.
## 0.1.0 - 2017-10-05
### Added
- Custom derive for generating the builder pattern.
- All setters are accepting `Into` values.
- Compile time verification that all fields are set before calling `.build()`.
- Compile time verification that no field is set more than once.
- Ability to annotate fields with `#[default]` to make them optional and specify a default value when the user does not set them.
- Generates simple documentation for the `.builder()` method.