1use std::collections::BTreeMap;
2use std::env;
3use std::path::Path;
4use std::path::PathBuf;
5
6
7const CARGO_MANIFEST_FILENAME: &str = "Cargo.toml";
8
9
10#[derive(Debug, Hash, Eq, PartialEq, Ord, PartialOrd)]
12pub struct Env {
13 pub cargo_manifest_filename: String,
15 pub vars: BTreeMap<String, String>,
16}
17
18
19impl Env {
20 pub fn cargo_out_dir(&self) -> &Path { Path::new(&self.vars["OUT_DIR"]) }
21 pub fn cargo_pkg_name(&self) -> &str { &self.vars["CARGO_PKG_NAME"] }
23 pub fn cargo_manifest_dir(&self) -> &Path { Path::new(&self.vars["CARGO_MANIFEST_DIR"]) }
24
25 pub fn try_default() -> Result<Self, env::VarError> {
27 Ok(Self { vars: env::vars().collect(),
28 cargo_manifest_filename: CARGO_MANIFEST_FILENAME.to_string() })
29 }
30
31 pub fn try_from_iter<K, V>(iter: impl Iterator<Item = (K, V)>) -> Result<Self, &'static str>
33 where K: ToString,
34 V: ToString {
35 let mut env = BTreeMap::new();
36 env.extend(iter.map(|(k, v)| (k.to_string(), v.to_string())));
37
38 env.get("CARGO_PKG_NAME").ok_or("Missed env 'CARGO_PKG_NAME'")?;
40 env.get("CARGO_MANIFEST_DIR")
41 .ok_or("Missed env 'CARGO_MANIFEST_DIR'")?;
42
43 Ok(Self { vars: env,
44 cargo_manifest_filename: CARGO_MANIFEST_FILENAME.to_string() })
45 }
46
47
48 pub fn manifest_path(&self) -> PathBuf { self.cargo_manifest_dir().join(&self.cargo_manifest_filename) }
49}