1use crate::cli::{parse_cli, CommandCli};
2use std::path::PathBuf;
3
4pub trait Env<C: CommandCli> {
6 fn runtime_name(&self) -> Option<String> {
8 None
9 }
10
11 fn data_directory(&self, runtime_name: &str) -> anyhow::Result<PathBuf> {
13 Ok(directories::ProjectDirs::from("", "", runtime_name)
14 .map(|dirs| dirs.data_dir().into())
15 .unwrap_or_else(|| PathBuf::from(runtime_name)))
16 }
17
18 fn args(&self) -> Box<dyn Iterator<Item = String>> {
20 Box::new(std::env::args())
21 }
22
23 fn cli(&mut self, project_name: &str, project_version: &str) -> anyhow::Result<C> {
25 let name = self
26 .runtime_name()
27 .unwrap_or_else(|| project_name.to_string());
28 parse_cli(&name, project_version, self.args())
29 }
30}
31
32#[derive(Clone, Copy, Debug)]
37pub struct DefaultEnv<C> {
38 phantom: std::marker::PhantomData<C>,
39}
40
41impl<C> Default for DefaultEnv<C> {
42 fn default() -> Self {
43 Self {
44 phantom: std::marker::PhantomData,
45 }
46 }
47}
48
49impl<C: CommandCli> Env<C> for DefaultEnv<C> {}