From 3c5dfc308b0ac5447a36656ba34ac7927e242163 Mon Sep 17 00:00:00 2001 From: Ninan John Date: Wed, 25 Dec 2019 09:56:45 +0530 Subject: [PATCH] [Ninan] Move conf related logic to separate mod --- src/conf.rs | 44 ++++++++++++++++++++++++++++++++++++++++++++ src/main.rs | 49 +++++-------------------------------------------- 2 files changed, 49 insertions(+), 44 deletions(-) create mode 100644 src/conf.rs diff --git a/src/conf.rs b/src/conf.rs new file mode 100644 index 0000000..ae992e3 --- /dev/null +++ b/src/conf.rs @@ -0,0 +1,44 @@ +use std::error::Error; +use std::fs; +use std::path::Path; +use serde::{Deserialize, Serialize}; + +use regex::Regex; + +#[derive(Debug, Serialize, Deserialize)] +pub struct GGConf { + #[serde(alias = "skipDirectories")] + #[serde(rename = "skipDirectories")] + filter_list: Vec, + #[serde(skip)] + pub filter_list_regex: Vec, +} + +pub fn read_conf_file(conf_file: &str) -> Result> { + if Path::new(conf_file).exists() { + let file = fs::File::open(conf_file)?; + let config: GGConf = serde_yaml::from_reader(file)?; + let updated_conf = create_filter_list(config)?; + return Ok(updated_conf); + } + let default = GGConf { filter_list: vec![], filter_list_regex: vec![] }; + let updated_conf = create_filter_list(default)?; + Ok(updated_conf) +} + +fn create_filter_list(conf: GGConf) -> Result> { + let mut filter_list = Vec::new(); + let mut filters = conf.filter_list.clone(); + let defaults: Vec = [".idea", ".DS_Store"].iter().map(|&s| s.into()).collect(); + defaults.iter().for_each(|def| { + filters.push(def.to_owned()); + }); + + filters.iter().for_each(|ignore| { + let re = Regex::new(format!(r".*/{}?*", ignore).as_str()).expect("failed to construct regex"); + filter_list.push(re); + }); + + let updated_conf = GGConf { filter_list: conf.filter_list, filter_list_regex: filter_list }; + Ok(updated_conf) +} diff --git a/src/main.rs b/src/main.rs index 8849ecc..0574ec0 100644 --- a/src/main.rs +++ b/src/main.rs @@ -6,14 +6,10 @@ extern crate reqwest; extern crate serde_yaml; extern crate walkdir; -use std::{fs, process}; -use std::error::Error; -use std::path::Path; +use std::process; use clap::{App, AppSettings, Arg, crate_version}; use colored::*; -use regex::Regex; -use serde::{Deserialize, Serialize}; mod input_args; mod status; @@ -21,6 +17,7 @@ mod create; mod fetch; mod git; mod dir; +mod conf; fn main() { let app = App::new("Git Governance") @@ -40,55 +37,19 @@ fn main() { let args = input_args::InputArgs::parse_inputs(global_matches.clone()); - let conf = read_conf_file(global_matches.value_of("conf").unwrap_or(".ggConf.yaml")).unwrap_or_else(|err| { + let conf = conf::read_conf_file(global_matches.value_of("conf").unwrap_or(".ggConf.yaml")).unwrap_or_else(|err| { println!("{} {}", "error while reading conf file:".red(), err.to_string().red()); process::exit(1) }); match args.input_command() { input_args::InputCommand::Status => { - let filter_list = create_filter_list(conf).expect("failed to create filter_list"); - status::status(args, filter_list) + status::status(args, conf.filter_list_regex) } input_args::InputCommand::Create => create::create(args), input_args::InputCommand::Fetch => { - let filter_list = create_filter_list(conf).expect("failed to create filter_list"); - fetch::fetch(args, filter_list) + fetch::fetch(args, conf.filter_list_regex) } input_args::InputCommand::Error => {} } } - -#[derive(Debug, PartialEq, Serialize, Deserialize)] -pub struct GGConf { - #[serde(alias = "skipDirectories")] - #[serde(rename = "skipDirectories")] - filter_list: Vec, -} - -fn read_conf_file(conf_file: &str) -> Result> { - if Path::new(conf_file).exists() { - let file = fs::File::open(conf_file)?; - let config: GGConf = serde_yaml::from_reader(file)?; - return Ok(config); - } - let default = GGConf { filter_list: vec![] }; - Ok(default) -} - -fn create_filter_list(conf: GGConf) -> Result, Box> { - let mut filter_list = Vec::new(); - let mut filters = conf.filter_list.clone(); - let defaults: Vec = [".idea", ".DS_Store"].iter().map(|&s| s.into()).collect(); - defaults.iter().for_each(|def| { - filters.push(def.to_owned()); - }); - - filters.iter().for_each(|ignore| { - let re = Regex::new(format!(r".*/{}?*", ignore).as_str()).expect("failed to construct regex"); - filter_list.push(re); - }); - - - Ok(filter_list) -}