diff --git a/Cargo.lock b/Cargo.lock index 833de826..7ef9775c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -308,7 +308,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn", + "syn 2.0.28", ] [[package]] @@ -356,6 +356,7 @@ dependencies = [ "shared", "shell-words", "toml", + "validator", "xdg", ] @@ -696,7 +697,7 @@ checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.28", ] [[package]] @@ -840,6 +841,12 @@ dependencies = [ "unicode-normalization", ] +[[package]] +name = "if_chain" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb56e1aa765b4b4f3aadfab769793b7087bb03a4ea4920644a6d238e2df5b9ed" + [[package]] name = "image" version = "0.24.7" @@ -1266,7 +1273,7 @@ checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.28", ] [[package]] @@ -1314,6 +1321,30 @@ dependencies = [ "miniz_oxide", ] +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn 1.0.109", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + [[package]] name = "proc-macro2" version = "1.0.66" @@ -1488,7 +1519,7 @@ checksum = "aafe972d60b0b9bee71a91b92fee2d4fb3c9d7e8f6b179aa99f27203d99a4816" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.28", ] [[package]] @@ -1626,6 +1657,17 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + [[package]] name = "syn" version = "2.0.28" @@ -1675,7 +1717,7 @@ checksum = "090198534930841fab3a5d1bb637cde49e339654e606195f8d9c76eeb081dc96" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.28", ] [[package]] @@ -1770,7 +1812,7 @@ checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.28", ] [[package]] @@ -1839,7 +1881,7 @@ checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.28", ] [[package]] @@ -1949,6 +1991,48 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" +[[package]] +name = "validator" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b92f40481c04ff1f4f61f304d61793c7b56ff76ac1469f1beb199b1445b253bd" +dependencies = [ + "idna", + "lazy_static", + "regex", + "serde", + "serde_derive", + "serde_json", + "url", + "validator_derive", +] + +[[package]] +name = "validator_derive" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc44ca3088bb3ba384d9aecf40c6a23a676ce23e09bdaca2073d99c207f864af" +dependencies = [ + "if_chain", + "lazy_static", + "proc-macro-error", + "proc-macro2", + "quote", + "regex", + "syn 1.0.109", + "validator_types", +] + +[[package]] +name = "validator_types" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "111abfe30072511849c5910134e8baf8dc05de4c0e5903d681cbd5c9c4d611e3" +dependencies = [ + "proc-macro2", + "syn 1.0.109", +] + [[package]] name = "valuable" version = "0.1.0" @@ -1998,7 +2082,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn", + "syn 2.0.28", "wasm-bindgen-shared", ] @@ -2020,7 +2104,7 @@ checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.28", "wasm-bindgen-backend", "wasm-bindgen-shared", ] diff --git a/config/Cargo.toml b/config/Cargo.toml index 7d279f30..73ee20b1 100644 --- a/config/Cargo.toml +++ b/config/Cargo.toml @@ -20,4 +20,5 @@ regex = "^1" serde = { version = "^1", features = [ "derive" ] } shell-words = "^1" toml = { version = "^0", features = [ "preserve_order" ] } +validator = { version = "^0", features = [ "derive" ] } xdg = "^2" diff --git a/config/src/lib.rs b/config/src/lib.rs index 19df1a8d..6f697a1e 100644 --- a/config/src/lib.rs +++ b/config/src/lib.rs @@ -12,6 +12,7 @@ mod preset; pub mod preview; pub mod tasks; pub mod theme; +mod validation; pub(crate) use pattern::*; pub(crate) use preset::*; diff --git a/config/src/tasks/tasks.rs b/config/src/tasks/tasks.rs index 5914332c..511fd7e7 100644 --- a/config/src/tasks/tasks.rs +++ b/config/src/tasks/tasks.rs @@ -1,11 +1,15 @@ use serde::Deserialize; +use validator::Validate; -use crate::MERGED_YAZI; +use crate::{validation::check_validation, MERGED_YAZI}; -#[derive(Debug, Deserialize)] +#[derive(Debug, Deserialize, Validate)] pub struct Tasks { + #[validate(range(min = 3, message = "Cannot be less than 3"))] pub micro_workers: u8, + #[validate(range(min = 5, message = "Cannot be less than 5"))] pub macro_workers: u8, + #[validate(range(min = 3, message = "Cannot be less than 3"))] pub bizarre_retry: u8, } @@ -17,9 +21,7 @@ impl Default for Tasks { } let tasks = toml::from_str::(&MERGED_YAZI).unwrap().tasks; - if tasks.micro_workers <= 2 || tasks.macro_workers <= 2 { - panic!("micro_workers, and macro_workers must be greater than 2"); - } + check_validation(tasks.validate()); tasks } diff --git a/config/src/theme/theme.rs b/config/src/theme/theme.rs index d3f66548..be12d237 100644 --- a/config/src/theme/theme.rs +++ b/config/src/theme/theme.rs @@ -2,15 +2,17 @@ use std::path::PathBuf; use serde::Deserialize; use shared::absolute_path; +use validator::Validate; use super::{ColorGroup, Filetype, Icon, Style}; -use crate::MERGED_THEME; +use crate::{validation::check_validation, MERGED_THEME}; -#[derive(Deserialize)] +#[derive(Deserialize, Validate)] pub struct Tab { pub active: Style, pub inactive: Style, - pub max_width: usize, + #[validate(range(min = 1, message = "Must be greater than 0"))] + pub max_width: u8, } #[derive(Deserialize)] @@ -73,8 +75,12 @@ pub struct Theme { impl Default for Theme { fn default() -> Self { let mut theme: Self = toml::from_str(&MERGED_THEME).unwrap(); + + check_validation(theme.tab.validate()); + theme.preview.syntect_theme = futures::executor::block_on(absolute_path(&theme.preview.syntect_theme)); + theme } } diff --git a/config/src/validation.rs b/config/src/validation.rs new file mode 100644 index 00000000..34a098f3 --- /dev/null +++ b/config/src/validation.rs @@ -0,0 +1,31 @@ +use std::{borrow::Cow, process}; + +use validator::{ValidationErrors, ValidationErrorsKind}; + +pub fn check_validation(res: Result<(), ValidationErrors>) { + let Err(errors) = res else { + return; + }; + + for (field, kind) in errors.into_errors() { + match kind { + ValidationErrorsKind::Struct(errors) => check_validation(Err(*errors)), + ValidationErrorsKind::List(errors) => { + for (i, errors) in errors { + print!("Config `{field}[{i}]` format error: "); + check_validation(Err(*errors)); + println!(); + } + } + ValidationErrorsKind::Field(error) => { + for e in error { + println!( + "Config `{field}` format error: {}\n", + e.message.unwrap_or(Cow::Borrowed("unknown error")) + ); + } + } + } + } + process::exit(1); +}