From 63d01ea03c5f82273f22a40fc5a9a48c2676105c Mon Sep 17 00:00:00 2001 From: Ian Wijma Date: Fri, 5 Jan 2024 21:15:34 +1100 Subject: [PATCH] Update manifest handling and integrate with command_init Introduced a new 'manifest' module to manage manifest files and updated 'command_init' to utilize this module, replacing previously hard-coded functionalities. Added 'manifest' package dependencies to Cargo.lock and command_init's Cargo.toml files. --- Cargo.lock | 77 +++++++++++++++++++++++++++++++++++ command_init/src/lib.rs | 8 +++- manifest/Cargo.toml | 2 + manifest/src/lib.rs | 43 +++++++++++++++---- manifest/src/manifest_file.rs | 37 +++++++++++++++++ 5 files changed, 158 insertions(+), 9 deletions(-) create mode 100644 manifest/src/manifest_file.rs diff --git a/Cargo.lock b/Cargo.lock index 9533a52..8fb9bc3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -113,6 +113,12 @@ dependencies = [ "manifest", ] +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + [[package]] name = "errno" version = "0.3.8" @@ -123,12 +129,34 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "hashbrown" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" + [[package]] name = "heck" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" +[[package]] +name = "indexmap" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" +dependencies = [ + "equivalent", + "hashbrown", +] + +[[package]] +name = "itoa" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" + [[package]] name = "libc" version = "0.2.151" @@ -144,6 +172,10 @@ checksum = "c4cd1a83af159aa67994778be9070f0ae1bd732942279cabb14f86f986a21456" [[package]] name = "manifest" version = "0.1.0" +dependencies = [ + "serde", + "serde_yaml", +] [[package]] name = "mccli" @@ -184,6 +216,45 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "ryu" +version = "1.0.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c" + +[[package]] +name = "serde" +version = "1.0.194" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b114498256798c94a0689e1a15fec6005dee8ac1f41de56404b67afc2a4b773" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.194" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3385e45322e8f9931410f01b3031ec534c3947d0e94c18049af4d9f9907d4e0" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_yaml" +version = "0.9.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1bf28c79a99f70ee1f1d83d10c875d2e70618417fda01ad1785e027579d9d38" +dependencies = [ + "indexmap", + "itoa", + "ryu", + "serde", + "unsafe-libyaml", +] + [[package]] name = "strsim" version = "0.10.0" @@ -232,6 +303,12 @@ version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85" +[[package]] +name = "unsafe-libyaml" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab4c90930b95a82d00dc9e9ac071b4991924390d46cbd0dfe566148667605e4b" + [[package]] name = "utf8parse" version = "0.2.1" diff --git a/command_init/src/lib.rs b/command_init/src/lib.rs index d80caa9..7d941fa 100644 --- a/command_init/src/lib.rs +++ b/command_init/src/lib.rs @@ -11,6 +11,10 @@ pub struct Arguments { pub fn execute (_arguments: &Arguments) { let directory: PathBuf = PathBuf::from(_arguments.directory.clone()); - let manifest = Manifest::new(&directory); - manifest.init(); + let manifest = Manifest::from(&directory); + + match manifest.init() { + true => println!("Project initialized"), + false => println!("Project already initialized") + } } diff --git a/manifest/Cargo.toml b/manifest/Cargo.toml index 1c98fd3..41dca6f 100644 --- a/manifest/Cargo.toml +++ b/manifest/Cargo.toml @@ -6,3 +6,5 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] +serde = {version = "1.0", features = ["derive"]} +serde_yaml = "0.9" \ No newline at end of file diff --git a/manifest/src/lib.rs b/manifest/src/lib.rs index be9a577..d39d631 100644 --- a/manifest/src/lib.rs +++ b/manifest/src/lib.rs @@ -1,13 +1,17 @@ +use std::error::Error; use std::fs; use std::path::{PathBuf}; +use crate::manifest_file::ManifestFile; + +mod manifest_file; #[derive(Debug)] pub struct Manifest { - directory: PathBuf + directory: PathBuf, } impl Manifest { - pub fn new(path: &PathBuf) -> Manifest { + pub fn from(path: &PathBuf) -> Manifest { let mut directory: PathBuf = path.into(); if path.is_file() { @@ -15,7 +19,7 @@ impl Manifest { .map(|parent| parent.to_path_buf()) .unwrap_or_else(|| path.into()) } - + if let Err(_err) = fs::create_dir_all(&directory) { panic!("Failed to created directory: {:?}", &directory); } @@ -23,11 +27,36 @@ impl Manifest { Manifest { directory: directory.canonicalize().unwrap() } } - pub fn init(&self) -> bool { - let directory: PathBuf = self.directory.clone(); + pub fn init(&self) -> bool { + let file: PathBuf = self.file_path(); - println!("init: {:?}", directory); + if !file.exists() { + let manifest_file: ManifestFile = ManifestFile::from(self.directory_name()); - true + return match manifest_file.write(&file) { + Ok(_) => true, + Err(_) => panic!("Unable to write to file: {:?}", &file) + } + } + + false + } + + pub fn file_path(&self) -> PathBuf { + return PathBuf::from(format!("{}/{}", self.directory.to_string_lossy(), "mccli.yaml")); + } + + pub fn directory_path(&self) -> PathBuf { + return PathBuf::from(&self.directory); + } + + pub fn directory_name(&self) -> String { + let directory = self.directory_path(); + + return directory + .file_name() + .unwrap() + .to_string_lossy() + .to_string(); } } diff --git a/manifest/src/manifest_file.rs b/manifest/src/manifest_file.rs new file mode 100644 index 0000000..00553f8 --- /dev/null +++ b/manifest/src/manifest_file.rs @@ -0,0 +1,37 @@ +use std::error::Error; +use std::fs; +use std::fs::File; +use serde::{Serialize, Deserialize}; +use std::path::PathBuf; +use serde::de::DeserializeOwned; + +#[derive(Serialize, Deserialize, Debug, Default)] +pub struct ManifestFile { + name: String, +} + +impl ManifestFile { + pub fn from(name: String) -> ManifestFile { + return ManifestFile { name } + } + + pub fn read(path: &PathBuf) -> Result> { + let file = File::open(path)?; + + let data: Content = serde_yaml::from_reader(file)?; + + Ok(data) + } + + pub fn write(&self, path: &PathBuf) -> Result> { + if path.exists() { + fs::remove_file(path)?; + } + + let file = File::create(path)?; + + serde_yaml::to_writer(file, self)?; + + Ok(true) + } +} \ No newline at end of file