diff --git a/rslib/src/search/parser.rs b/rslib/src/search/parser.rs index 117906ab4..400346c2a 100644 --- a/rslib/src/search/parser.rs +++ b/rslib/src/search/parser.rs @@ -54,7 +54,7 @@ pub(super) enum SearchNode<'a> { text: Cow<'a, str>, }, AddedInDays(u32), - CardTemplate(Cow<'a, str>), + CardTemplate(TemplateKind), Deck(Cow<'a, str>), NoteTypeID(ObjID), NoteType(Cow<'a, str>), @@ -96,6 +96,12 @@ pub(super) enum StateKind { Suspended, } +#[derive(Debug, PartialEq)] +pub(super) enum TemplateKind { + Ordinal(u16), + Name(String), +} + /// Parse the input string into a list of nodes. #[allow(dead_code)] pub(super) fn parse(input: &str) -> std::result::Result, String> { @@ -223,13 +229,13 @@ fn search_node_for_text_with_argument<'a>( ) -> ParseResult> { Ok(match key.to_ascii_lowercase().as_str() { "added" => SearchNode::AddedInDays(val.parse()?), - "card" => SearchNode::CardTemplate(val), "deck" => SearchNode::Deck(val), "note" => SearchNode::NoteType(val), "tag" => SearchNode::Tag(val), "mid" => SearchNode::NoteTypeID(val.parse()?), "nid" => SearchNode::NoteIDs(check_id_list(val)?), "cid" => SearchNode::CardIDs(check_id_list(val)?), + "card" => parse_template(val.as_ref()), "is" => parse_state(val.as_ref())?, "flag" => parse_flag(val.as_ref())?, "rated" => parse_rated(val.as_ref())?, @@ -350,6 +356,13 @@ fn parse_prop(val: &str) -> ParseResult> { }) } +fn parse_template(val: &str) -> SearchNode<'static> { + SearchNode::CardTemplate(match val.parse::() { + Ok(n) => TemplateKind::Ordinal(n), + Err(_) => TemplateKind::Name(val.into()), + }) +} + #[cfg(test)] mod test { use super::*; @@ -380,7 +393,11 @@ mod test { assert_eq!(parse("added:3")?, vec![Search(AddedInDays(3))]); assert_eq!( parse("card:front")?, - vec![Search(CardTemplate("front".into()))] + vec![Search(CardTemplate(TemplateKind::Name("front".into())))] + ); + assert_eq!( + parse("card:3")?, + vec![Search(CardTemplate(TemplateKind::Ordinal(3)))] ); assert_eq!(parse("deck:default")?, vec![Search(Deck("default".into()))]); assert_eq!(parse("note:basic")?, vec![Search(NoteType("basic".into()))]);