#![crate_name = "fileman_rs"]
use std::io;
mod organize;
mod tools;
pub trait RunTask {
fn run_task(&self) -> Result<(), io::Error>;
}
#[derive(Debug, PartialEq, Eq)]
pub enum Config {
Organize(organize::OrganizeTask),
}
impl Config {
pub fn new(mut args: impl Iterator<Item = String>) -> Result<Config, &'static str> {
args.next();
let task = match args.next() {
Some(arg) => arg,
None => return Err("no task specified"),
};
match task.to_lowercase().as_str() {
"organize" => {
let organize_task = organize::OrganizeTask::new(args)?;
Ok(Self::Organize(organize_task))
}
_ => return Err("provided task did not match any defined tasks"),
}
}
}
impl RunTask for Config {
fn run_task(&self) -> Result<(), io::Error> {
match self {
Config::Organize(task) => task.run_task(),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn config_new_organize_with_valid_args() {
let args_1 = [String::from("./src"), String::from("./src/organize")].into_iter();
let organize_task = organize::OrganizeTask::new(args_1).unwrap();
let args_2 = [
String::from("foo"),
String::from("organize"),
String::from("./src"),
String::from("./src/organize"),
]
.into_iter();
assert_eq!(Config::new(args_2), Ok(Config::Organize(organize_task)))
}
#[test]
fn config_new_no_task() {
let args = [String::from("foo")].into_iter();
assert!(Config::new(args).is_err());
}
#[test]
fn config_new_invalid_task() {
let args = [String::from("foo"), String::from("bar")].into_iter();
assert!(Config::new(args).is_err());
}
}