refactor: introduces the validator (#57)

This commit is contained in:
三咲雅 · Misaki Masa 2023-08-15 07:29:21 +08:00 committed by GitHub
parent 80619597d3
commit 35ca32e74b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 142 additions and 17 deletions

102
Cargo.lock generated
View file

@ -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",
]

View file

@ -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"

View file

@ -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::*;

View file

@ -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::<Outer>(&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
}

View file

@ -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
}
}

31
config/src/validation.rs Normal file
View file

@ -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);
}