Skip to content
WARNING

You are viewing the docs for an older major version of bon (v1).

Click here to view the docs for the latest version (v3).

Optional members

Setters generated for members of Option<T> type are themselves optional to call. If they aren't invoked, then None will be used as the default.

Example:

rust
use bon::builder;

#[builder]
fn example(level: Option<u32>) {}

// We can call it without specifying `level`
example().call();

The setters generated in the example above are the following (simplified):

rust
impl ExampleBuilder {
    // Accepts the underlying value. Wraps it in `Some()` internally
    fn level(value: u32) -> NextBuilderState { /* */ }

    // Accepts the `Option` directly.
    fn maybe_level(value: Option<u32>) -> NextBuilderState { /* */ }
}

This allows for the following call patterns.

If you need to pass a simple literal value, then the syntax is very short

rust
example().level(42).call();

If you already have an Option variable somewhere or you need to dynamically decide if the value should be Some or None, then you can use the maybe_ variant of the setter.

rust
let value = if some_condition {
    Some(42)
} else {
    None
};

example().maybe_level(value).call();

To make a non-Option function argument or struct field optional you may add #[builder(default)] to it, which generates the equivalent builder API as if the type was Option<T>. See #[builder(default)] docs for details.

Interaction with Into conversions

The inner type T of the Option<T> is subject to Into conversion. For example, if T by default qualifies for an automatic Into conversion or #[builder(into)] was used to force it, then the generated builder API will provide the following two setters:

rust
impl Builder {
    fn member(self, value: impl Into<T>) -> NextBuilderState { /* */ }
    fn maybe_member(self, value: Option<impl Into<T>>) -> NextBuilderState { /* */ }
}

Example:

rust
use bon::builder;

#[builder]
fn example(level: Option<String>) {}

example()
    .level("Accepts `impl Into<String>`, which allows for passing `&str`")
    .call();

example()
    .maybe_level(Some(
        "Accepts `Option<impl Into<String>>`, \
        which allows for passing `Option<&str>`"
    ))
    .call();