use std::borrow::Cow;
use camino::{Utf8Path, Utf8PathBuf};
use serde_json::Value;
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
#[non_exhaustive]
pub enum MergeProvenance {
Defaults,
File,
Environment,
Cli,
}
#[derive(Clone, Debug)]
pub struct MergeLayer<'a> {
provenance: MergeProvenance,
value: Cow<'a, Value>,
path: Option<Utf8PathBuf>,
}
impl<'a> MergeLayer<'a> {
#[must_use]
pub const fn defaults(value: Cow<'a, Value>) -> Self {
Self {
provenance: MergeProvenance::Defaults,
value,
path: None,
}
}
#[must_use]
pub const fn file(value: Cow<'a, Value>, path: Option<Utf8PathBuf>) -> Self {
Self {
provenance: MergeProvenance::File,
value,
path,
}
}
#[must_use]
pub const fn environment(value: Cow<'a, Value>) -> Self {
Self {
provenance: MergeProvenance::Environment,
value,
path: None,
}
}
#[must_use]
pub const fn cli(value: Cow<'a, Value>) -> Self {
Self {
provenance: MergeProvenance::Cli,
value,
path: None,
}
}
#[must_use]
pub const fn provenance(&self) -> MergeProvenance {
self.provenance
}
#[must_use]
pub fn path(&self) -> Option<&Utf8Path> {
self.path.as_deref()
}
#[must_use]
pub fn into_value(self) -> Value {
self.value.into_owned()
}
#[must_use]
pub fn into_owned(self) -> MergeLayer<'static> {
MergeLayer {
provenance: self.provenance,
value: Cow::Owned(self.value.into_owned()),
path: self.path,
}
}
}