use super::{ComposeScalar, Located};
use crate::source::SourceSpan;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct EnvironmentListEntry {
raw: Located<String>,
name: String,
value: Option<String>,
}
impl EnvironmentListEntry {
pub(super) fn parse(raw: Located<String>) -> Self {
let (name, value) = raw.value().split_once('=').map_or_else(
|| (raw.value().clone(), None),
|(name, value)| (name.to_owned(), Some(value.to_owned())),
);
Self { raw, name, value }
}
#[must_use]
pub const fn raw(&self) -> &Located<String> {
&self.raw
}
#[must_use]
pub fn name(&self) -> &str {
&self.name
}
#[must_use]
pub fn value(&self) -> Option<&str> {
self.value.as_deref()
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct EnvironmentMapEntry {
name: Located<String>,
value: Located<ComposeScalar>,
span: SourceSpan,
}
impl EnvironmentMapEntry {
pub(super) const fn new(name: Located<String>, value: Located<ComposeScalar>, span: SourceSpan) -> Self {
Self { name, value, span }
}
#[must_use]
pub const fn name(&self) -> &Located<String> {
&self.name
}
#[must_use]
pub const fn value(&self) -> &Located<ComposeScalar> {
&self.value
}
#[must_use]
pub const fn span(&self) -> SourceSpan {
self.span
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum Environment {
List {
span: SourceSpan,
entries: Vec<EnvironmentListEntry>,
},
Map {
span: SourceSpan,
entries: Vec<EnvironmentMapEntry>,
},
}
impl Environment {
#[must_use]
pub const fn span(&self) -> SourceSpan {
match self {
Self::List { span, .. } | Self::Map { span, .. } => *span,
}
}
}