#![deny(rust_2018_idioms)]
#![allow(clippy::type_complexity, clippy::new_without_default)]
#![recursion_limit = "256"]
#[macro_use]
extern crate async_trait;
#[cfg(feature = "jsonwebtoken")]
use jsonwebtoken as jwt;
#[macro_use]
extern crate lazy_static;
#[macro_use]
extern crate log;
#[cfg(feature = "rouille")]
#[macro_use(router)]
extern crate rouille;
#[macro_use]
extern crate serde_derive;
#[cfg(test)]
#[macro_use]
mod test;
#[macro_use]
pub mod errors;
#[cfg(feature = "azure")]
mod azure;
mod cache;
mod client;
mod cmdline;
mod commands;
mod compiler;
pub mod config;
pub mod dist;
mod jobserver;
pub mod lru_disk_cache;
mod mock_command;
mod protocol;
pub mod server;
#[cfg(feature = "simple-s3")]
mod simples3;
#[doc(hidden)]
pub mod util;
use std::env;
pub const LOGGING_ENV: &str = "SCCACHE_LOG";
pub fn main() {
init_logging();
let command = match cmdline::try_parse() {
Ok(cmd) => cmd,
Err(e) => match e.downcast::<clap::error::Error>() {
Ok(clap_err) => clap_err.exit(),
Err(some_other_err) => {
println!("sccache: {some_other_err}");
for source in some_other_err.chain().skip(1) {
println!("sccache: caused by: {source}");
}
std::process::exit(1);
}
},
};
std::process::exit(match commands::run_command(command) {
Ok(s) => s,
Err(e) => {
eprintln!("sccache: error: {}", e);
for e in e.chain().skip(1) {
eprintln!("sccache: caused by: {}", e);
}
2
}
});
}
fn init_logging() {
if env::var(LOGGING_ENV).is_ok() {
match env_logger::Builder::from_env(LOGGING_ENV).try_init() {
Ok(_) => (),
Err(e) => panic!("Failed to initialize logging: {:?}", e),
}
}
}