From 1b43fa1af439904569cb59a1e83168f0470b8ae9 Mon Sep 17 00:00:00 2001 From: "J.c" Date: Sun, 6 Nov 2022 19:20:55 +0100 Subject: [PATCH 1/4] =?UTF-8?q?feat=20(config):=20=E2=9C=A8=20Extract=20co?= =?UTF-8?q?nfig=20reader=20code=20and=20add=20default=20fallback?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/config/generate.rs | 64 ++++++++++++++++++++++++++++++++ src/{config.rs => config/mod.rs} | 35 ++++++----------- 2 files changed, 76 insertions(+), 23 deletions(-) create mode 100644 src/config/generate.rs rename src/{config.rs => config/mod.rs} (70%) diff --git a/src/config/generate.rs b/src/config/generate.rs new file mode 100644 index 0000000..7a92e7c --- /dev/null +++ b/src/config/generate.rs @@ -0,0 +1,64 @@ +use std::{fs, path::PathBuf}; + +use super::{ConfigOptions, Part, Variant}; + +pub fn read_from_path(path: PathBuf) -> Option { + let config_yml = fs::read_to_string(path).ok()?; + let config = serde_yaml::from_str(&config_yml).ok()?; + + config +} + +pub fn default_config() -> ConfigOptions { + ConfigOptions { + variants: vec![ + Variant { + name: String::from("Conventional Commits"), + parts: vec![ + Part::ConventionalType, + Part::TextInput { + prompt: String::from("Scope"), + pattern: Some(String::from(" ({0})")), + }, + Part::Literal { + value: String::from(": "), + }, + Part::TextInput { + prompt: String::from("Description"), + pattern: None, + }, + ], + }, + Variant { + name: String::from("Gitmoji"), + parts: vec![ + Part::Gitmoji, + Part::Space, + Part::TextInput { + prompt: String::from("Description"), + pattern: None, + }, + ], + }, + Variant { + name: String::from("CC + Gitmoji"), + parts: vec![ + Part::ConventionalType, + Part::TextInput { + prompt: String::from("Scope"), + pattern: Some(String::from(" ({0})")), + }, + Part::Literal { + value: String::from(": "), + }, + Part::Gitmoji, + Part::Space, + Part::TextInput { + prompt: String::from("Description"), + pattern: None, + }, + ], + }, + ], + } +} diff --git a/src/config.rs b/src/config/mod.rs similarity index 70% rename from src/config.rs rename to src/config/mod.rs index 033d26c..00210c5 100644 --- a/src/config.rs +++ b/src/config/mod.rs @@ -1,8 +1,10 @@ -use std::{fmt::Display, fs, path::PathBuf}; - use home::home_dir; - use serde::Deserialize; +use std::{fmt::Display, path::PathBuf}; + +use self::generate::{default_config, read_from_path}; + +mod generate; #[derive(Deserialize)] pub struct ConfigOptions { @@ -47,23 +49,6 @@ pub struct SelectOption { pub description: Option, } -const _TEST_YML: &str = "\ -- type: ConventionalType -- type: Literal - value: ' (' -- type: Select - prompt: 'Scope: ' - options: - - key: fileui5 - - key: listui5 -- type: Literal - value: '): ' -- type: Gitmoji -- type: Space -- type: TextInput - prompt: 'Description: ' -"; - pub struct Config { config: ConfigOptions, } @@ -72,10 +57,14 @@ impl Config { pub fn new() -> Self { let mut config_path = PathBuf::from(home_dir().unwrap()); config_path.push(".config/gcm/config.yml"); - let config_yml = fs::read_to_string(config_path).unwrap(); - let config = serde_yaml::from_str(&config_yml).unwrap(); - Config { config } + if let Some(config) = read_from_path(config_path) { + Config { config } + } else { + Config { + config: default_config(), + } + } } pub fn variants(&self) -> &Vec { From 5402e6420f106990ebc093eb757867f3e27d8805 Mon Sep 17 00:00:00 2001 From: "J.c" Date: Mon, 14 Nov 2022 17:04:03 +0100 Subject: [PATCH 2/4] =?UTF-8?q?fix=20(config):=20=F0=9F=92=AC=20Remove=20s?= =?UTF-8?q?pace=20of=20scope=20pattern=20in=20default=20config?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/config/generate.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config/generate.rs b/src/config/generate.rs index 7a92e7c..4971d06 100644 --- a/src/config/generate.rs +++ b/src/config/generate.rs @@ -18,7 +18,7 @@ pub fn default_config() -> ConfigOptions { Part::ConventionalType, Part::TextInput { prompt: String::from("Scope"), - pattern: Some(String::from(" ({0})")), + pattern: Some(String::from("({0})")), }, Part::Literal { value: String::from(": "), From a7fe96ed482c3a3e37fbe1ad7348417a18584734 Mon Sep 17 00:00:00 2001 From: "J.c" Date: Wed, 15 Feb 2023 20:12:42 +0100 Subject: [PATCH 3/4] =?UTF-8?q?refactor:=20=E2=99=BB=EF=B8=8F=20RESTRUCTUR?= =?UTF-8?q?E=20project?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.toml | 5 ++++- src/lib.rs | 1 - src/{ => lib}/config/generate.rs | 0 src/{ => lib}/config/mod.rs | 0 src/{utils/error.rs => lib/error/mod.rs} | 0 src/{utils/git.rs => lib/git/mod.rs} | 0 src/lib/lib.rs | 4 ++++ src/{ => lib}/prompt/conventional_type.rs | 2 +- src/{ => lib}/prompt/gitmoji.rs | 2 +- src/{ => lib}/prompt/message_builder.rs | 0 src/{ => lib}/prompt/mod.rs | 0 src/main.rs | 12 ++++++------ src/utils/mod.rs | 2 -- 13 files changed, 16 insertions(+), 12 deletions(-) delete mode 100644 src/lib.rs rename src/{ => lib}/config/generate.rs (100%) rename src/{ => lib}/config/mod.rs (100%) rename src/{utils/error.rs => lib/error/mod.rs} (100%) rename src/{utils/git.rs => lib/git/mod.rs} (100%) create mode 100644 src/lib/lib.rs rename src/{ => lib}/prompt/conventional_type.rs (81%) rename src/{ => lib}/prompt/gitmoji.rs (90%) rename src/{ => lib}/prompt/message_builder.rs (100%) rename src/{ => lib}/prompt/mod.rs (100%) delete mode 100644 src/utils/mod.rs diff --git a/Cargo.toml b/Cargo.toml index bd150f2..2eb422e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,7 +3,9 @@ name = "git-commit-messenger" version = "0.1.0" edition = "2021" -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html +[lib] +name = "gcm" +path = "src/lib/lib.rs" [dependencies] duct = "0.13.5" @@ -15,3 +17,4 @@ serde_yaml = "0.9.13" termination = "0.1.2" thiserror = "1.0.37" yaml-rust = "0.4.5" + diff --git a/src/lib.rs b/src/lib.rs deleted file mode 100644 index b5614dd..0000000 --- a/src/lib.rs +++ /dev/null @@ -1 +0,0 @@ -pub mod utils; diff --git a/src/config/generate.rs b/src/lib/config/generate.rs similarity index 100% rename from src/config/generate.rs rename to src/lib/config/generate.rs diff --git a/src/config/mod.rs b/src/lib/config/mod.rs similarity index 100% rename from src/config/mod.rs rename to src/lib/config/mod.rs diff --git a/src/utils/error.rs b/src/lib/error/mod.rs similarity index 100% rename from src/utils/error.rs rename to src/lib/error/mod.rs diff --git a/src/utils/git.rs b/src/lib/git/mod.rs similarity index 100% rename from src/utils/git.rs rename to src/lib/git/mod.rs diff --git a/src/lib/lib.rs b/src/lib/lib.rs new file mode 100644 index 0000000..3c17e35 --- /dev/null +++ b/src/lib/lib.rs @@ -0,0 +1,4 @@ +pub mod config; +pub mod error; +pub mod git; +pub mod prompt; diff --git a/src/prompt/conventional_type.rs b/src/lib/prompt/conventional_type.rs similarity index 81% rename from src/prompt/conventional_type.rs rename to src/lib/prompt/conventional_type.rs index e044006..6b11c78 100644 --- a/src/prompt/conventional_type.rs +++ b/src/lib/prompt/conventional_type.rs @@ -2,7 +2,7 @@ use inquire::Select; use crate::config::SelectOption; -const CONVENTIONAL_TYPE_JSON: &str = include_str!("../data/conventional_types.json"); +const CONVENTIONAL_TYPE_JSON: &str = include_str!("../../data/conventional_types.json"); pub fn select_conventional_type() -> String { let conventional_types: Vec = diff --git a/src/prompt/gitmoji.rs b/src/lib/prompt/gitmoji.rs similarity index 90% rename from src/prompt/gitmoji.rs rename to src/lib/prompt/gitmoji.rs index 634884e..9a05e42 100644 --- a/src/prompt/gitmoji.rs +++ b/src/lib/prompt/gitmoji.rs @@ -9,7 +9,7 @@ struct Gitmoji { description: String, } -const GITMOJI_JSON: &str = include_str!("../data/gitmojis.json"); +const GITMOJI_JSON: &str = include_str!("../../data/gitmojis.json"); impl Display for Gitmoji { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { diff --git a/src/prompt/message_builder.rs b/src/lib/prompt/message_builder.rs similarity index 100% rename from src/prompt/message_builder.rs rename to src/lib/prompt/message_builder.rs diff --git a/src/prompt/mod.rs b/src/lib/prompt/mod.rs similarity index 100% rename from src/prompt/mod.rs rename to src/lib/prompt/mod.rs diff --git a/src/main.rs b/src/main.rs index c691efa..a1adfe1 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,11 +1,11 @@ -mod config; -mod prompt; -use config::{Config, Part}; +use gcm::{ + config::{Config, Part}, + error::Error, + git, + prompt::message_builder::MessageBuilder, +}; use inquire::{Confirm, Select}; -use crate::prompt::message_builder::MessageBuilder; -use git_commit_messenger::utils::{error::Error, git}; - #[termination::display] fn main() -> Result<(), Error> { git::check_ready()?; diff --git a/src/utils/mod.rs b/src/utils/mod.rs deleted file mode 100644 index 1007cfd..0000000 --- a/src/utils/mod.rs +++ /dev/null @@ -1,2 +0,0 @@ -pub mod error; -pub mod git; From e34f089e5347d94817dc02d93d99383db6dcce1a Mon Sep 17 00:00:00 2001 From: "J.c" Date: Wed, 15 Feb 2023 20:23:30 +0100 Subject: [PATCH 4/4] =?UTF-8?q?refactor:=20=F0=9F=9A=A8=20fix=20clippy=20w?= =?UTF-8?q?arnings?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/lib/config/generate.rs | 3 +-- src/lib/config/mod.rs | 16 +++++++++++----- src/lib/prompt/message_builder.rs | 14 ++++++++++---- src/main.rs | 8 ++++---- 4 files changed, 26 insertions(+), 15 deletions(-) diff --git a/src/lib/config/generate.rs b/src/lib/config/generate.rs index 4971d06..06f8d3b 100644 --- a/src/lib/config/generate.rs +++ b/src/lib/config/generate.rs @@ -4,9 +4,8 @@ use super::{ConfigOptions, Part, Variant}; pub fn read_from_path(path: PathBuf) -> Option { let config_yml = fs::read_to_string(path).ok()?; - let config = serde_yaml::from_str(&config_yml).ok()?; - config + serde_yaml::from_str(&config_yml).ok()? } pub fn default_config() -> ConfigOptions { diff --git a/src/lib/config/mod.rs b/src/lib/config/mod.rs index 00210c5..8846e1f 100644 --- a/src/lib/config/mod.rs +++ b/src/lib/config/mod.rs @@ -1,6 +1,6 @@ use home::home_dir; use serde::Deserialize; -use std::{fmt::Display, path::PathBuf}; +use std::fmt::Display; use self::generate::{default_config, read_from_path}; @@ -55,15 +55,13 @@ pub struct Config { impl Config { pub fn new() -> Self { - let mut config_path = PathBuf::from(home_dir().unwrap()); + let mut config_path = home_dir().unwrap(); config_path.push(".config/gcm/config.yml"); if let Some(config) = read_from_path(config_path) { Config { config } } else { - Config { - config: default_config(), - } + Default::default() } } @@ -71,3 +69,11 @@ impl Config { &self.config.variants } } + +impl Default for Config { + fn default() -> Self { + Config { + config: default_config(), + } + } +} diff --git a/src/lib/prompt/message_builder.rs b/src/lib/prompt/message_builder.rs index 35a0f06..caa0368 100644 --- a/src/lib/prompt/message_builder.rs +++ b/src/lib/prompt/message_builder.rs @@ -19,12 +19,18 @@ pub struct MessageBuilder { message: String, } -impl MessageBuilder { - pub fn new() -> Self { +impl Default for MessageBuilder { + fn default() -> Self { MessageBuilder { message: String::from(""), } } +} + +impl MessageBuilder { + pub fn new() -> Self { + Default::default() + } pub fn consume(self) -> String { self.message @@ -68,7 +74,7 @@ impl MessageBuilder { } pub fn add_literal(&mut self, literal: &str) -> &Self { - self.add_text(&literal) + self.add_text(literal) } pub fn select_conventional_type(&mut self) -> &Self { @@ -78,7 +84,7 @@ impl MessageBuilder { } fn add_text(&mut self, text: &str) -> &Self { - self.message.push_str(&text); + self.message.push_str(text); self } diff --git a/src/main.rs b/src/main.rs index a1adfe1..8aba7b8 100644 --- a/src/main.rs +++ b/src/main.rs @@ -29,7 +29,7 @@ fn main() -> Result<(), Error> { git::commit(message); } - return Ok(()); + Ok(()) } fn prompt_user(parts: &[Part]) -> String { @@ -41,11 +41,11 @@ fn prompt_user(parts: &[Part]) -> String { prompt, options, pattern, - } => message_builder.select_prompt(&prompt, options, pattern), + } => message_builder.select_prompt(prompt, options, pattern), Part::Space => message_builder.add_literal(" "), Part::Gitmoji => message_builder.select_gitmoji(), - Part::Literal { value } => message_builder.add_literal(&value), - Part::TextInput { prompt, pattern } => message_builder.text_input(&prompt, &pattern), + Part::Literal { value } => message_builder.add_literal(value), + Part::TextInput { prompt, pattern } => message_builder.text_input(prompt, pattern), Part::ConventionalType => message_builder.select_conventional_type(), }; }