use std::fmt::Display;
use std::fmt::Formatter;
use std::fmt::Result;
use super::variable_name::VariableName;
use super::variable_value::VariableValue;
#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug)]
pub struct Variable {
name: VariableName,
value: VariableValue,
}
impl Variable {
pub fn new(name: impl Into<VariableName>, value: impl Into<VariableValue>) -> Self {
Self {
name: name.into(),
value: value.into(),
}
}
pub fn name(&self) -> &VariableName {
&self.name
}
pub fn value(&self) -> &VariableValue {
&self.value
}
}
impl Display for Variable {
fn fmt(&self, formatter: &mut Formatter<'_>) -> Result {
write!(formatter, "{}={}", self.name, self.value)
}
}
impl<N: Into<VariableName>, V: Into<VariableValue>> From<(N, V)> for Variable {
fn from((name, value): (N, V)) -> Self {
Self::new(name, value)
}
}
#[cfg(test)]
mod tests {
#![allow(clippy::missing_panics_doc)]
use super::*;
#[test]
fn from_pair_keeps_the_name_and_the_value() {
let variable = Variable::from(("RUSTUP_TOOLCHAIN", "stable"));
assert_eq!(
(
variable.name().get().to_str(),
variable.value().get().to_str()
),
(Some("RUSTUP_TOOLCHAIN"), Some("stable"))
);
}
#[test]
fn to_string_returns_the_name_and_the_value() {
let variable = Variable::new("RUSTUP_TOOLCHAIN", "stable");
assert_eq!(variable.to_string(), "RUSTUP_TOOLCHAIN=stable");
}
}