Skip to content
WARNING

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

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

Fallible Builders

With bon, you can write a builder that validates its inputs and returns a Result. It's possible to do this only via the function or associated method syntax.

If you need to build a struct and do some validation, you won't be able to use the #[derive(Builder)] annotation on the struct for that. You'll have to define your logic in the associated constructor method (e.g. new).

Example:

rust
use anyhow::Error;
use bon::bon;

struct User {
    id: u32,
    name: String,
}

#[bon]
impl User {
    #[builder]
    fn new(id: u32, name: String) -> Result<Self, Error> {
        if name.is_empty() {
            return Err(anyhow::anyhow!("Empty name is disallowed (user id: {id})"));
        }

        Ok(Self { id, name })
    }
}

// The `build()` method returns a `Result`
let result = User::builder()
    .id(42)
    .name(String::new())
    .build();

if let Err(error) = result {
    // Handle the error
}

If you have a use case for some convenience attributes to do automatic validations using the #[derive(Builder)] macro with the struct syntax, then add a 👍 reaction to this Github issue.