use std::collections::{BTreeMap, HashMap};
use std::convert::Infallible;
use std::ops::Range;
pub trait Env {
type GetVariableError;
type AssignVariableError;
fn get_variable(&self, name: &str) -> Result<Option<&str>, Self::GetVariableError>;
fn assign_variable(
&mut self,
name: &str,
value: String,
location: Range<usize>,
) -> Result<(), Self::AssignVariableError>;
}
impl Env for HashMap<String, String> {
type GetVariableError = Infallible;
type AssignVariableError = Infallible;
fn get_variable(&self, name: &str) -> Result<Option<&str>, Infallible> {
Ok(self.get(name).map(String::as_str))
}
fn assign_variable(
&mut self,
name: &str,
value: String,
_location: Range<usize>,
) -> Result<(), Infallible> {
self.insert(name.to_owned(), value);
Ok(())
}
}
impl Env for BTreeMap<String, String> {
type GetVariableError = Infallible;
type AssignVariableError = Infallible;
fn get_variable(&self, name: &str) -> Result<Option<&str>, Infallible> {
Ok(self.get(name).map(String::as_str))
}
fn assign_variable(
&mut self,
name: &str,
value: String,
_location: Range<usize>,
) -> Result<(), Infallible> {
self.insert(name.to_owned(), value);
Ok(())
}
}