mzdeisotoper 0.1.9

Deisotoping and charge state deconvolution of mass spectrometry files
Documentation
use std::fs;
use std::io;
use std::path::PathBuf;

use clap::Parser;
use figment::{
    providers::{Env, Format, Serialized, Toml},
    Figment,
};

use tracing_subscriber::{fmt, prelude::*, EnvFilter};

use mzdeisotoper::{MZDeiosotoper, MZDeisotoperError};

pub fn main() -> Result<(), MZDeisotoperError> {
    let subscriber = tracing_subscriber::registry()
        .with(EnvFilter::from_default_env().add_directive(tracing::Level::TRACE.into()))
        .with(
            fmt::layer()
                .compact()
                .with_timer(fmt::time::ChronoLocal::rfc_3339())
                .with_writer(io::stderr)
                .with_filter(
                    EnvFilter::builder()
                        .with_default_directive(tracing::Level::INFO.into())
                        .from_env_lossy(),
                ),
        );

    let mut config = Figment::new();
    let args = MZDeiosotoper::parse();

    if let Some(cpath) = args.config_file.clone() {
        config = config.merge(Serialized::defaults(args));
        config = config.merge(Toml::file_exact(cpath));
    } else {
        config = config.merge(Serialized::defaults(args));
    }

    if PathBuf::from("mzdeisotoper.toml").exists() {
        config = config.merge(Toml::file_exact("mzdeisotoper.toml"));
    }

    let args: MZDeiosotoper = config
        .merge(Env::prefixed("MZDEISOTOPER_"))
        .extract()
        .unwrap();

    if let Some(log_path) = args.log_file.as_ref() {
        let log_file = fs::File::create(log_path)?;
        let (log_file, _guard) = tracing_appender::non_blocking(log_file);
        let subscriber = subscriber.with(
            fmt::layer()
                .compact()
                .with_ansi(false)
                .with_writer(log_file)
                .with_filter(
                    EnvFilter::builder()
                        .with_default_directive(tracing::Level::INFO.into())
                        .from_env_lossy(),
                ),
        );
        subscriber.init();
        args.main()?;
    } else {
        subscriber.init();
        args.main()?;
    }
    Ok(())
}