Skip to main content

fhir_core/
builder.rs

1//! Support for the generated resource/datatype builders.
2//!
3//! `#[derive(fhir_derive_macros::Builder)]` generates a `<Type>Builder` with a
4//! chainable setter per field and a `build()` that returns
5//! [`Result<T, BuilderError>`], failing if a required (`1..1`) field was not set.
6//! Optional (`0..1`) and repeating fields default to absent/empty.
7//!
8//! The error type is release-independent, so it is defined once here and
9//! re-exported as [`r4::builder`](crate::r4::builder) and
10//! [`r5::builder`](crate::r5::builder); see those modules for worked examples.
11//!
12//! ```
13//! use fhir::builder::BuilderError;
14//!
15//! let err = BuilderError::missing("status");
16//! assert_eq!(err.missing_field, "status");
17//! assert_eq!(err.to_string(), "required field `status` was not set");
18//! ```
19
20use std::fmt;
21
22/// Error returned by a builder's `build()` when a required field is missing.
23#[derive(Debug, Clone, PartialEq, Eq)]
24pub struct BuilderError {
25    /// The name of the required field that was not set.
26    pub missing_field: String,
27}
28
29impl BuilderError {
30    /// A missing required field.
31    #[must_use]
32    pub fn missing(field: &str) -> Self {
33        Self {
34            missing_field: field.to_string(),
35        }
36    }
37}
38
39impl fmt::Display for BuilderError {
40    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
41        write!(f, "required field `{}` was not set", self.missing_field)
42    }
43}
44
45impl std::error::Error for BuilderError {}