gitmoji-changelog 0.4.0

Do you use gitmoji? Then generate your changelog with this app!
Documentation
#[macro_use]
extern crate serde_derive;
#[macro_use]
extern crate serde_json;
#[macro_use]
extern crate lazy_static;
#[macro_use]
extern crate clap;

use std::fs::{self, File};
use std::io::prelude::*;
use std::process;

use regex::Regex;

mod changelog;
mod cli;
mod commit;
mod error;
mod group;
mod version;

use crate::changelog::Changelog;

lazy_static! {
    static ref REG_FROM: Regex = Regex::new("<a name=\"(.*?)\".*").unwrap();
}
const HEADER: &str = "# Changelog";
const FOOTER: &str = "_Generated by [gitmoji-changelog (rust version)](https://github.com/fabienjuif/gitmoji-changelog-rust)_";

fn main() {
    let matches = cli::parse_args();

    let repository = matches.value_of("path").unwrap();
    eprintln!("Git repository path: {}", repository);

    let get_delta = |from| {
        let changelog = Changelog::from(repository, from);

        match changelog.to_markdown(
            matches.value_of("release"),
            matches.is_present("print-authors"),
        ) {
            Err(error) => {
                eprintln!("{}", error);
                process::exit(1);
            }
            Ok(delta) => delta,
        }
    };

    let format = |header, delta, footer| {
        if matches.is_present("delta") {
            return delta;
        }

        format!("{}\n{}\n{}", header, delta, footer)
    };

    let print = |changelog: String| match matches.value_of("output") {
        None => println!("{}", changelog),
        Some(path) => {
            let mut file = File::create(path).unwrap();
            file.write_all(changelog.as_bytes()).unwrap();
        }
    };

    match fs::read_to_string(format!("{}/CHANGELOG.md", repository)) {
        Err(_) => print(format(HEADER, get_delta(None), FOOTER)),
        Ok(old_changelog) => {
            let mut old_changelog = old_changelog.to_string();
            let last_version_index = old_changelog.find("<a name=").unwrap();
            let rest = old_changelog.split_off(last_version_index);

            let last_version = REG_FROM.captures(&rest).unwrap();
            let last_version = last_version.get(1).map(|c| c.as_str());

            print(format(&old_changelog, get_delta(last_version), &rest));
        }
    };
}