From 8d32f80ead59bc2e9c787b91aa00f418439bf5b0 Mon Sep 17 00:00:00 2001 From: Joakim Holm Date: Mon, 3 Apr 2023 13:30:52 +0200 Subject: [PATCH] Add more selections for config --- Cargo.lock | 27 +++++++++++++++++++++++++++ Cargo.toml | 1 + src/config.rs | 3 ++- src/find_command.rs | 11 +++++++++-- src/format.rs | 2 ++ 5 files changed, 41 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5340e88..6582451 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,15 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "aho-corasick" +version = "0.7.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac" +dependencies = [ + "memchr", +] + [[package]] name = "ansi_term" version = "0.12.1" @@ -242,6 +251,23 @@ dependencies = [ "thiserror", ] +[[package]] +name = "regex" +version = "1.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b1f693b24f6ac912f4893ef08244d70b6067480d2f1a46e950c9691e6749d1d" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.6.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" + [[package]] name = "serde" version = "1.0.159" @@ -330,6 +356,7 @@ dependencies = [ "base64", "dirs", "displaydoc", + "regex", "serde", "structopt", "thiserror", diff --git a/Cargo.toml b/Cargo.toml index 194679b..d791bf4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,6 +12,7 @@ dirs = { version = "4" } base64 = "0.21" thiserror = "1.0" displaydoc = "0.2" +regex = "1" [profile.release] lto = true diff --git a/src/config.rs b/src/config.rs index 021b046..26daf70 100644 --- a/src/config.rs +++ b/src/config.rs @@ -1,5 +1,5 @@ use serde::Deserialize; -use std::path::{Path, PathBuf}; +use std::path::Path; #[derive(Deserialize)] pub struct Config { @@ -8,6 +8,7 @@ pub struct Config { #[derive(Default, Deserialize)] pub struct Rule { + pub url: Option, pub scheme: Option, pub host: Option, pub path: Option, diff --git a/src/find_command.rs b/src/find_command.rs index 423e7eb..3c509bd 100644 --- a/src/find_command.rs +++ b/src/find_command.rs @@ -5,7 +5,11 @@ use crate::config::{Config, Rule}; fn url_matches_param(url_data: &Option<&str>, param: &Option) -> bool { match (param, url_data) { (None, _) => true, - (Some(param), Some(url_data)) if param == url_data => true, + (Some(param), Some(url_data)) => { + if let Some(re) = regex::Regex::new(¶m).ok() { + re.is_match(&url_data) + } else { false } + }, _ => false } } @@ -13,9 +17,12 @@ fn url_matches_param(url_data: &Option<&str>, param: &Option) -> bool { /// Returns true if `rule` matches `url` fn url_match_rule(url: &Url, rule: &Rule) -> bool { [ + (Some(url.as_str()), &rule.url), (Some(url.scheme()), &rule.scheme), (url.host_str(), &rule.host), (Some(url.path()), &rule.path), + (url.query(), &rule.query), + (url.fragment(), &rule.fragment) ].iter().all(|(url_data, param)| url_matches_param(url_data, param)) } @@ -54,7 +61,7 @@ mod test { let url = url::Url::parse("https://example.com").unwrap(); let config = super::Config{rules: vec![ super::Rule { - scheme: Some("https".to_string()), + scheme: Some("https?".to_string()), ..Default::default() } ]}; diff --git a/src/format.rs b/src/format.rs index 9406e5a..443f2ea 100644 --- a/src/format.rs +++ b/src/format.rs @@ -49,6 +49,8 @@ fn get_variable<'a>(url: &'a Url, key: &str) -> Option<&'a str> { "scheme" => Some(url.scheme()), "host" => url.host_str(), "path" => Some(url.path()), + "query" => url.query(), + "fragment" => url.fragment(), _ => None, } }