use std::{
borrow::Cow,
ffi::OsStr,
};
use crate::{
FieldSanitizer,
NameMatchMode,
};
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct EnvSanitizer {
field_sanitizer: FieldSanitizer,
}
impl EnvSanitizer {
pub const fn new(field_sanitizer: FieldSanitizer) -> Self {
Self { field_sanitizer }
}
pub const fn field_sanitizer(&self) -> &FieldSanitizer {
&self.field_sanitizer
}
pub fn field_sanitizer_mut(&mut self) -> &mut FieldSanitizer {
&mut self.field_sanitizer
}
pub fn sanitize_value<'a>(
&self,
key: &str,
value: &'a str,
match_mode: NameMatchMode,
) -> Cow<'a, str> {
self.field_sanitizer.sanitize_value(key, value, match_mode)
}
pub fn sanitize_pair(
&self,
key: &str,
value: &str,
match_mode: NameMatchMode,
) -> (String, String) {
(
key.to_string(),
self.sanitize_value(key, value, match_mode).into_owned(),
)
}
pub fn sanitize_os_pair<K, V>(
&self,
key: K,
value: V,
match_mode: NameMatchMode,
) -> (String, String)
where
K: AsRef<OsStr>,
V: AsRef<OsStr>,
{
let key = key.as_ref().to_string_lossy();
let value = value.as_ref().to_string_lossy();
(
key.to_string(),
self.sanitize_value(key.as_ref(), value.as_ref(), match_mode)
.into_owned(),
)
}
pub fn sanitize_assignment(&self, assignment: &str, match_mode: NameMatchMode) -> String {
let Some((key, value)) = assignment.split_once('=') else {
return assignment.to_string();
};
let sanitized_value = self.sanitize_value(key, value, match_mode);
format!("{key}={sanitized_value}")
}
pub fn sanitize_assignments<I, S>(
&self,
assignments: I,
match_mode: NameMatchMode,
) -> Vec<String>
where
I: IntoIterator<Item = S>,
S: AsRef<str>,
{
assignments
.into_iter()
.map(|assignment| self.sanitize_assignment(assignment.as_ref(), match_mode))
.collect()
}
}
impl Default for EnvSanitizer {
fn default() -> Self {
Self::new(FieldSanitizer::default())
}
}