summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoel Klinghed <the_jk@spawned.biz>2026-01-06 11:34:16 +0100
committerJoel Klinghed <the_jk@spawned.biz>2026-01-06 11:34:16 +0100
commitd521c995068f817238acb171a5ed9e2ec7f79f45 (patch)
tree4295a04b648579781d50fcf1379cc3daef2c8af2
parentdcee5c87f57e81d2702b0f56478f67a602c765c7 (diff)
Support patterns that ignore parts of stringHEADmain
-rw-r--r--src/main.rs53
1 files changed, 31 insertions, 22 deletions
diff --git a/src/main.rs b/src/main.rs
index 534f418..0e46290 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -22,24 +22,29 @@ impl Config {
struct Match {
line: String,
- group: Range<usize>,
+ match_range: Range<usize>,
+ sort_range: Range<usize>,
}
impl Match {
- fn new(line: String, group: Range<usize>) -> Self {
- Self { line, group }
+ fn new(line: String, match_range: Range<usize>, sort_range: Range<usize>) -> Self {
+ Self {
+ line,
+ match_range,
+ sort_range,
+ }
}
fn prefix(&self) -> &str {
- &self.line[0..self.group.start]
+ &self.line[0..self.match_range.start]
}
fn infix(&self) -> &str {
- &self.line[self.group.clone()]
+ &self.line[self.sort_range.clone()]
}
fn suffix(&self) -> &str {
- &self.line[self.group.end..self.line.len()]
+ &self.line[self.match_range.end..self.line.len()]
}
}
@@ -74,10 +79,10 @@ fn load_config(path: &PathBuf) -> anyhow::Result<Config> {
if let Some(patterns_str) = groups.get("groups") {
let mut patterns_regex = Vec::with_capacity(patterns_str.len());
for pattern in patterns_str {
- let regex = RegexBuilder::new(pattern).size_limit(42_000).build()?;
- if regex.captures_len() != 2 {
+ let regex = RegexBuilder::new(pattern).size_limit(100_000).build()?;
+ if regex.captures_len() <= 1 {
return Err(anyhow!(
- "Invalid pattern {}, capture groups are not one",
+ "Invalid pattern {}, expecting at least one capture group",
pattern
));
}
@@ -92,19 +97,23 @@ fn default_config() -> Config {
Config::new(vec![Regex::new(r"part([0-9]+)").unwrap()])
}
-fn get_group(config: &Config, input: &str) -> (i64, Range<usize>) {
+fn get_group(config: &Config, input: &str) -> (i64, Range<usize>, Range<usize>) {
if let Some(index) = config.set.matches(input).iter().next() {
- return (
- index as i64,
- config.patterns[index]
- .captures(input)
- .unwrap()
- .get(1)
- .unwrap()
- .range(),
- );
+ let captures = config.patterns[index].captures(input).unwrap();
+ let match_range = captures.get(0).unwrap().range();
+ let mut sort_range = captures.get(1).unwrap().range();
+ for i in 2..captures.len() {
+ let next = captures.get(i).unwrap().range();
+ if next.start < sort_range.start {
+ sort_range.start = next.start;
+ }
+ if next.end > sort_range.end {
+ sort_range.end = next.end;
+ }
+ }
+ return (index as i64, match_range, sort_range);
}
- (-1, 0..0)
+ (-1, 0..0, 0..0)
}
fn print_group(matches: &[Match]) {
@@ -133,8 +142,8 @@ fn main() -> anyhow::Result<()> {
break;
}
buffer.truncate(buffer.trim_end().len());
- let (group, part) = get_group(&config, &buffer);
- let m = Match::new(buffer, part);
+ let (group, match_range, sort_range) = get_group(&config, &buffer);
+ let m = Match::new(buffer, match_range, sort_range);
if let std::collections::hash_map::Entry::Vacant(e) = groups.entry(group) {
e.insert(PatternGroup::new(vec![m]));
} else {