configbuilder-pattern-loader 0.1.0

configbuilder-pattern: loader domain, trait contract + tech-agnostic reference implementation.
Documentation
use crate::{FeatureMetadata, FeatureRecord, OverrideSource};

/// Fluent builder for [`FeatureRecord`].
///
/// Start with [`crate::FeatureRecordBuilderOps::new`], chain the setter methods, then
/// call [`build`] to obtain a [`FeatureRecord`].
///
/// [`build`]: crate::FeatureRecordBuilderOps::build
pub struct FeatureRecordBuilder {
    section_name: String,
    enabled: bool,
    override_source: Option<OverrideSource>,
    requires: &'static [&'static str],
    metadata: Box<FeatureMetadata>,
}

impl FeatureRecordBuilder {
    pub(crate) fn new(section_name: impl Into<String>) -> Self {
        Self {
            section_name: section_name.into(),
            enabled: false,
            override_source: None,
            requires: &[],
            metadata: Box::new(FeatureMetadata::default()),
        }
    }

    pub(crate) fn enabled(mut self, v: bool) -> Self {
        self.enabled = v;
        self
    }

    pub(crate) fn override_source(mut self, v: OverrideSource) -> Self {
        self.override_source = Some(v);
        self
    }

    pub(crate) fn requires(mut self, v: &'static [&'static str]) -> Self {
        self.requires = v;
        self
    }

    pub(crate) fn metadata(mut self, v: FeatureMetadata) -> Self {
        self.metadata = Box::new(v);
        self
    }

    pub(crate) fn build(self) -> FeatureRecord {
        FeatureRecord {
            section_name: self.section_name,
            enabled: self.enabled,
            override_source: self.override_source,
            requires: self.requires,
            metadata: self.metadata,
        }
    }
}

impl crate::FeatureRecordBuilderOps for FeatureRecordBuilder {
    fn new(section_name: impl Into<String>) -> Self {
        FeatureRecordBuilder::new(section_name)
    }

    fn enabled(self, v: bool) -> Self {
        FeatureRecordBuilder::enabled(self, v)
    }

    fn override_source(self, v: OverrideSource) -> Self {
        FeatureRecordBuilder::override_source(self, v)
    }

    fn requires(self, v: &'static [&'static str]) -> Self {
        FeatureRecordBuilder::requires(self, v)
    }

    fn metadata(self, v: FeatureMetadata) -> Self {
        FeatureRecordBuilder::metadata(self, v)
    }

    fn build(self) -> FeatureRecord {
        FeatureRecordBuilder::build(self)
    }
}