#[macro_use] extern crate derive_builder; use derive_builder::UninitializedFieldError; trait Popular { fn is_popular(&self) -> bool; } impl<'a> Popular for &'a str { fn is_popular(&self) -> bool { !self.starts_with('b') } } #[derive(Debug, Builder)] #[builder(build_fn(validate = "check_person", error = "Error"))] struct Person { name: N, age: u16, } enum Error { UninitializedField(&'static str), UnpopularName(N), } impl From for Error { fn from(error: UninitializedFieldError) -> Self { Self::UninitializedField(error.field_name()) } } fn check_person(builder: &PersonBuilder) -> Result<(), Error> { if let Some(name) = &builder.name { if !name.is_popular() { return Err(Error::UnpopularName(name.clone())); } } Ok(()) } fn main() {}