From 87bc1e69b0c637fc4427364ea1ca4c8d56c1130b Mon Sep 17 00:00:00 2001 From: Henrik Giesel Date: Sun, 10 Jan 2021 16:16:17 +0100 Subject: [PATCH] Coerce added/edited:0 to 1, constrain rated:n to 1 <= 365 --- rslib/src/search/parser.rs | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/rslib/src/search/parser.rs b/rslib/src/search/parser.rs index 9e03abcc5..ea0ff441b 100644 --- a/rslib/src/search/parser.rs +++ b/rslib/src/search/parser.rs @@ -273,8 +273,8 @@ fn search_node_for_text_with_argument<'a>( val: &'a str, ) -> ParseResult> { Ok(match key.to_ascii_lowercase().as_str() { - "added" => SearchNode::AddedInDays(val.parse()?), - "edited" => SearchNode::EditedInDays(val.parse()?), + "added" => parse_added(val)?, + "edited" => parse_edited(val)?, "deck" => SearchNode::Deck(unescape(val)?), "note" => SearchNode::NoteType(unescape(val)?), "tag" => SearchNode::Tag(unescape(val)?), @@ -309,6 +309,20 @@ fn check_id_list(s: &str) -> ParseResult<&str> { } } +/// eg added:1 +fn parse_added(s: &str) -> ParseResult> { + let n: u32 = s.parse()?; + let days = n.max(1); + Ok(SearchNode::AddedInDays(days)) +} + +/// eg edited:1 +fn parse_edited(s: &str) -> ParseResult> { + let n: u32 = s.parse()?; + let days = n.max(1); + Ok(SearchNode::EditedInDays(n)) +} + /// eg is:due fn parse_state(s: &str) -> ParseResult> { use StateKind::*; @@ -339,7 +353,10 @@ fn parse_flag(s: &str) -> ParseResult> { /// second arg must be between 0-4 fn parse_rated(val: &str) -> ParseResult> { let mut it = val.splitn(2, ':'); - let days = it.next().unwrap().parse()?; + + let n: u32 = it.next().unwrap().parse()?; + let days = n.max(1).min(365); + let ease = match it.next() { Some(v) => { let n: u8 = v.parse()?;