Skip to content

Latest commit

 

History

History
285 lines (237 loc) · 11.5 KB

CHANGELOG.md

File metadata and controls

285 lines (237 loc) · 11.5 KB

Changelog

All notable changes to this project will be documented in this file.

The format is based on Keep a Changelog and this project adheres to Semantic Versioning.

[Unreleased]

0.20.0 - 2024-08-22

Added

  • Add #[builder(setter(strip_option(fallback = field_opt)))] to add a fallback unstripped method to the builder struct.
  • Add #[builder(setter(strip_bool(fallback = field_bool)))] to add a fallback setter that takes the bool value to the builder struct.

0.19.1 - 2024-07-14

Fixed

  • Fix mutators for generic fields (see issue #149)

0.19.0 - 2024-06-15

Added

  • Use fields' doc comments for the setters.

0.18.2 - 2024-04-16

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 impls (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. 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 (#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.