From bbb2544bd06f29866465d651c32ca4d6e017f5e9 Mon Sep 17 00:00:00 2001 From: Jan Allersma Date: Dec 11 2018 15:45:44 +0000 Subject: Implement `add` command. --- diff --git a/src/backend/add.rs b/src/backend/add.rs new file mode 100644 index 0000000..e2e1222 --- /dev/null +++ b/src/backend/add.rs @@ -0,0 +1,58 @@ +extern crate serde_json; + +use std::env; +use std::result::Result; +use std::path::PathBuf; + +pub fn add(args: &mut env::Args) -> Result { + let dep_dir: PathBuf; + + let dep_name = match args.next() { + Some(name) => name, + None => return Err(String::from("Missing dependency name!")) + }; + + match super::filesystem::get_dep_root() { + Ok(mut dir) => { + dir.push(dep_name.clone()); + dep_dir = dir; + }, + Err(e) => return Err(e.to_string()) + } + + if dep_dir.exists() { + return Err(String::from("Dependency already exists.")) + } + + let mut args: String = args.into_iter().map(|arg| arg + " ").collect(); + + match args.pop() { + Some(_) => update_module(dep_name, args), + None => update_module(dep_name, String::new()) + } +} + +fn update_module(key: String, value: String) -> Result { + let path: PathBuf; + let config: serde_json::Value; + + match super::filesystem::get_module_root() { + Some(p) => path = p, + None => return Err(String::from("No config file in module found.")) + } + + match super::config::get_json(path.clone()) { + Ok(mut json) => { + json["deps"]["linux"][key.clone()] = json!(value); + json["deps"]["os-x"][key.clone()] = json!(value); + json["deps"]["windows"][key] = json!(value); + config = json.clone(); + }, + Err(e) => return Err(e) + } + + match super::config::update(path, config) { + Ok(_) => Ok(String::from("Dependency added!")), + Err(e) => Err(e) + } +} diff --git a/src/backend/check.rs b/src/backend/check.rs index 260e822..571c6a8 100644 --- a/src/backend/check.rs +++ b/src/backend/check.rs @@ -126,7 +126,7 @@ pub fn dep(config: serde_json::Value) -> Result { } fn dir_check(dependency: String, command: String) -> Result { - let dir = super::filesystem::get_dep_dir(); + let dir = super::filesystem::get_dep_root(); match dir { Ok(mut dep_dir) => { diff --git a/src/backend/config.rs b/src/backend/config.rs index 20ae5d1..9a5c8b1 100644 --- a/src/backend/config.rs +++ b/src/backend/config.rs @@ -38,6 +38,20 @@ pub fn create(mut path: PathBuf) -> Result<(), Error> { Ok(()) } +pub fn update(mut path: PathBuf, value: serde_json::Value) -> Result<(), String> { + path.push("beheer.json"); + + match File::create(path) { + Ok(mut file) => { + match file.write_all(serde_json::to_string_pretty(&value).unwrap().as_bytes()) { + Ok(_) => Ok(()), + Err(e) => Err(e.to_string()) + } + }, + Err(e) => Err(e.to_string()) + } +} + fn read(mut path: PathBuf) -> Result { let mut config = String::new(); diff --git a/src/backend/filesystem.rs b/src/backend/filesystem.rs index 7b57573..fd33d13 100644 --- a/src/backend/filesystem.rs +++ b/src/backend/filesystem.rs @@ -38,7 +38,7 @@ pub fn get_project_root() -> Option { } } -pub fn get_dep_dir() -> Result { +pub fn get_dep_root() -> Result { match get_project_root() { Some(mut path) => { path.push("dep"); diff --git a/src/backend/mod.rs b/src/backend/mod.rs index 4b4da8d..7601bdb 100644 --- a/src/backend/mod.rs +++ b/src/backend/mod.rs @@ -1,3 +1,4 @@ +pub mod add; pub mod config; pub mod project; pub mod filesystem; diff --git a/src/backend/project.rs b/src/backend/project.rs index c772de1..093e329 100644 --- a/src/backend/project.rs +++ b/src/backend/project.rs @@ -91,8 +91,9 @@ pub fn help() { println!("--help -h\t\tShow this message"); println!(""); - println!("init [DIRECTORY]\tInitialize new project in specified directory. Defaults to current directory."); - println!("build\t\t\tBuild current project."); - println!("run [ARGUMENTS]\t\tBuild and run current project with ARGUMENTS to run project with."); - println!("exe [ARGUMENTS]\t\tRun current project with ARGUMENTS. The project won't be built."); + println!("init [DIRECTORY]\t\tInitialize new project in specified directory. Defaults to current directory."); + println!("build\t\t\t\tBuild current project."); + println!("run [ARGUMENTS]\t\t\tBuild and run current project with ARGUMENTS to run project with."); + println!("exe [ARGUMENTS]\t\t\tRun current project with ARGUMENTS. The project won't be built."); + println!("add NAME COMMAND [ARGUMENTS]\tAdd dependency with NAME to module and is built through COMMAND with ARGUMENTS."); } diff --git a/src/main.rs b/src/main.rs index a1a3bd1..58a7dd2 100644 --- a/src/main.rs +++ b/src/main.rs @@ -44,6 +44,12 @@ fn parse() { Err(e) => println!("Running project failed: {}", e) } } + else if &argument == "add" { + match backend::add::add(&mut argv) { + Ok(msg) => println!("{}", msg), + Err(e) => println!("Could not add dependency: {}", e) + } + } }, None => backend::project::help() }