1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
pub use std::fmt::Error;
use std::{
    collections::hash_map::DefaultHasher,
    env,
    ffi::OsString,
    hash::{Hash, Hasher},
    process::Command,
};

pub type Result<I> = ::std::result::Result<I, Error>;

#[cfg(feature = "config")]
pub mod config;
pub mod recompile;

pub mod at_helpers;
pub mod helpers;
// TODO: PR to update incompatible dirs "^1"
#[cfg(all(feature = "logger", not(target_arch = "wasm32")))]
pub mod logger;

pub fn calculate_hash<T: Hash>(t: &T) -> u64 {
    let mut s = DefaultHasher::new();
    t.hash(&mut s);
    s.finish()
}

pub fn definitely_not_nightly() -> bool {
    let mut cmd = Command::new(cargo_binary());
    cmd.arg("--version");

    let output = match cmd.output() {
        Ok(output) => output,
        Err(_) => return false,
    };

    let version = match String::from_utf8(output.stdout) {
        Ok(version) => version,
        Err(_) => return false,
    };

    version.starts_with("cargo 1") && !version.contains("nightly")
}

fn cargo_binary() -> OsString {
    env::var_os("CARGO").unwrap_or_else(|| "cargo".to_owned().into())
}