bomper 0.8.0

bumps versions in files
Documentation
use bomper::config::Config;
use clap::Parser;
use std::path::PathBuf;

mod app;
use app::App;

mod cli;
use cli::{Args, Commands};

fn main() -> Result<(), Box<dyn std::error::Error>> {
    tracing_subscriber::fmt()
        .without_time()
        .with_target(false)
        .init();

    let args = Args::parse();
    tracing::debug!(?args);

    let project = project_base_directory::Project::discover()
        .map_err(|_| bomper::error::Error::ProjectBaseDirectory)?;
    tracing::debug!(?project);
    match args.base_args.repository {
        Some(ref repo) => {
            std::env::set_current_dir(repo)?;
        }
        None => {
            if let Some(base_directory) = project.root_directory {
                std::env::set_current_dir(base_directory)?;
            }
        }
    }

    let config_path = if let Some(path) = &args.base_args.config_file {
        path.to_owned()
    } else {
        let config_path = match project.config_home {
            Some(dir) => {
                let config_path = dir.join("bomp.ron");
                if config_path.exists() {
                    config_path
                } else {
                    PathBuf::from("bomp.ron")
                }
            }
            None => PathBuf::from("bomp.ron"),
        };
        if !config_path.exists() {
            return Err("No configuration file found".into());
        }
        config_path.clone()
    };
    let config_path = config_path.canonicalize()?;
    tracing::debug!(?config_path);
    let config = Config::from_ron(&config_path)?;
    tracing::debug!(?config);

    let app = App::new(config);
    match args.command {
        Commands::Changelog(changelog) => {
            app.changelog(&changelog)?;
        }
        Commands::RawBump(raw_bump) => {
            app.raw_bump(&raw_bump)?;
        }
        Commands::Bump(bump) => {
            app.bump(&bump)?;
        }
    }
    Ok(())
}