pub mod env;
pub mod file;
pub mod json;
use cli_utils::BoxResult;
use std::ffi::OsStr;
use std::fmt;
use std::path::PathBuf;
use std::str::FromStr;
use crate::environment::Environment;
use crate::storage;
pub const DEFAULT_FILE_OUT: &str = ".projvars.env.txt";
pub trait VarSink: fmt::Display {
fn is_usable(&self, environment: &Environment) -> bool;
fn store(
&self,
environment: &Environment,
values: &[storage::Value],
) -> BoxResult<()>;
}
#[must_use]
pub fn cli_list(
env_out: bool,
dry: bool,
default_out_file: bool,
additional_out_files: Vec<PathBuf>,
) -> Vec<Box<dyn VarSink>> {
let mut sinks: Vec<Box<dyn VarSink>> = vec![];
if env_out {
sinks.push(Box::new(env::VarSink {}));
}
if default_out_file {
log::info!("Using the default out file: {DEFAULT_FILE_OUT}");
sinks.push(Box::new(file::VarSink {
file: PathBuf::from_str(DEFAULT_FILE_OUT).unwrap(),
}));
}
for out_file in additional_out_files {
if out_file
.extension()
.and_then(OsStr::to_str)
.is_some_and(|ext| ext.to_lowercase().ends_with("json"))
{
log::trace!("Going to sink to JSON file: {}", out_file.display());
sinks.push(Box::new(json::VarSink { file: out_file }));
} else {
log::trace!("Going to sink to ENV file: {}", out_file.display());
sinks.push(Box::new(file::VarSink { file: out_file }));
}
}
if dry {
sinks.clear();
} else if sinks.is_empty() {
log::warn!("No sinks registered! The results of this run will not be stored anywhere.");
} else {
for sink in &sinks {
log::trace!("Registered sink {sink}.");
}
}
sinks
}