cargo-bump 0.0.1

Increments the version number of the current project.
extern crate clap;
extern crate semver;
extern crate toml;

mod config;
mod version;

use std::fs::OpenOptions;
use std::io::Write;
use toml::Value;

fn main() {
    let conf = config::get_config();
    let (mut v, mut t) = version::get_current_version(&conf.manifest);
    let old_version = v.clone();
    version::update_version(&mut v, conf.version);
    println!("Version {} -> {}", old_version, v);

    match t {
        Value::Table(ref mut top) => {
            match top.get_mut("package").unwrap() {
                &mut Value::Table(ref mut package) => {
                    let version = package.entry("version".to_owned())
                        .or_insert_with(|| panic!("missing package"));
                    *version = toml::Value::String(v.to_string());
                }
                _ => panic!("package not a table")
            }
        }
        _ => panic!("top not a table")
    }

    let new_manifest = build_new_manifest(t).unwrap();
    let new_manifest_bytes = new_manifest.as_bytes();
    let mut f = OpenOptions::new()
        .write(true)
        .truncate(true)
        .open(&conf.manifest)
        .unwrap();
    f.write_all(new_manifest_bytes).unwrap();
}

fn build_new_manifest(toml: Value) -> Option<String> {
    match toml {
        Value::Table(mut data) => {
            let package_value = data.remove("package").unwrap();
            Some(format!("[package]\n{}{}",
                         package_value,
                         toml::Value::Table(data)))
        }
        _ => None
    }
}