summaryrefslogtreecommitdiffstats
path: root/src/cli.rs
diff options
context:
space:
mode:
authorMatthias Beyer <mail@beyermatthias.de>2020-12-07 13:22:55 +0100
committerMatthias Beyer <mail@beyermatthias.de>2020-12-07 13:22:55 +0100
commit0b74829c3b04ccb3be5a0a1e6b68882bf86192dd (patch)
treeae0fb0b9d719bdadc6a023fe21b08cec33c4729b /src/cli.rs
parent57ec34edef57fdb92ebed0cd71cb3afe120bd4bd (diff)
Reimplement env_pass_validator() using pom, add tests
Signed-off-by: Matthias Beyer <mail@beyermatthias.de>
Diffstat (limited to 'src/cli.rs')
-rw-r--r--src/cli.rs140
1 files changed, 102 insertions, 38 deletions
diff --git a/src/cli.rs b/src/cli.rs
index dcab2d1..cf2a123 100644
--- a/src/cli.rs
+++ b/src/cli.rs
@@ -479,45 +479,29 @@ pub fn cli<'a>() -> App<'a> {
///
/// TODO: Clean up this spaghetti code
fn env_pass_validator(s: &str) -> Result<(), String> {
- let v = s.split("=").collect::<Vec<_>>();
-
- if v.len() != 2 {
- if v.len() == 1 {
- if let Some(name) = v.get(0) {
- match std::env::var(name) {
- Err(std::env::VarError::NotPresent) => {
- return Err(format!("Environment variable '{}' not present", name))
- },
- Err(std::env::VarError::NotUnicode(_)) => {
- return Err(format!("Environment variable '{}' not unicode", name))
- },
- Ok(_) => return Ok(()),
- }
- } else {
- return Err(format!("BUG")) // TODO: Make nice, not runtime error
- }
- } else {
- return Err(format!("Expected a 'key=value' string, got something different: '{}'", s))
- }
- } else {
- if let Some(key) = v.get(0) {
- if key.chars().any(|c| c == ' ' || c == '\t' || c == '\n') {
- return Err(format!("Invalid characters found in key: '{}'", s))
- }
- } else {
- return Err(format!("No key found in '{}'", s))
- }
-
- if let Some(value) = v.get(1) {
- if value.chars().any(|c| c == ' ' || c == '\t' || c == '\n') {
- return Err(format!("Invalid characters found in value: '{}'", s))
- }
- } else {
- return Err(format!("No value found in '{}'", s))
- }
+ use crate::util::parser::*;
+ let parser = {
+ let key = (letters() + ((letters() | numbers() | under()).repeat(0..)))
+ .collect()
+ .convert(|b| String::from_utf8(b.to_vec()));
+
+ let val = nonempty_string_with_optional_quotes()
+ .collect()
+ .convert(|b| String::from_utf8(b.to_vec()));
+
+ (key + equal() + val).map(|((k, _), v)| (k, v))
+ };
+
+ match parser.parse(s.as_bytes()).map_err(|e| e.to_string()) {
+ Err(s) => {
+ log::error!("Error during validation: '{}' is not a key-value pair", s);
+ Err(s)
+ },
+ Ok((k, v)) => {
+ log::debug!("Env pass valiation: '{}={}'", k, v);
+ Ok(())
+ },
}
-
- Ok(())
}
fn dir_exists_validator(s: &str) -> Result<(), String> {
@@ -528,3 +512,83 @@ fn dir_exists_validator(s: &str) -> Result<(), String> {
}
}
+#[cfg(test)]
+mod tests {
+ use super::env_pass_validator;
+
+ #[test]
+ fn test_env_pass_validator_1() {
+ assert!(env_pass_validator("foo=\"bar\"").is_ok());
+ }
+
+ #[test]
+ fn test_env_pass_validator_2() {
+ assert!(env_pass_validator("foo=bar").is_ok());
+ }
+
+ #[test]
+ fn test_env_pass_validator_3() {
+ assert!(env_pass_validator("foo=\"1\"").is_ok());
+ }
+
+ #[test]
+ fn test_env_pass_validator_4() {
+ assert!(env_pass_validator("foo=1").is_ok());
+ }
+
+ #[test]
+ fn test_env_pass_validator_5() {
+ assert!(env_pass_validator("FOO=\"bar\"").is_ok());
+ }
+
+ #[test]
+ fn test_env_pass_validator_6() {
+ assert!(env_pass_validator("FOO=bar").is_ok());
+ }
+
+ #[test]
+ fn test_env_pass_validator_7() {
+ assert!(env_pass_validator("FOO=\"1\"").is_ok());
+ }
+
+ #[test]
+ fn test_env_pass_validator_8() {
+ assert!(env_pass_validator("FOO=1").is_ok());
+ }
+
+ #[test]
+ fn test_env_pass_validator_9() {
+ assert!(env_pass_validator("1=1").is_err());
+ }
+
+ #[test]
+ fn test_env_pass_validator_10() {
+ assert!(env_pass_validator("=").is_err());
+ }
+
+ #[test]
+ fn test_env_pass_validator_11() {
+ assert!(env_pass_validator("a=").is_err());
+ }
+
+ #[test]
+ fn test_env_pass_validator_12() {
+ assert!(env_pass_validator("=a").is_err());
+ }
+
+ #[test]
+ fn test_env_pass_validator_13() {
+ assert!(env_pass_validator("a").is_err());
+ }
+
+ #[test]
+ fn test_env_pass_validator_14() {
+ assert!(env_pass_validator("avjasva").is_err());
+ }
+
+ #[test]
+ fn test_env_pass_validator_15() {
+ assert!(env_pass_validator("123").is_err());
+ }
+}
+