synthphonia/text/parsing/
weekday.rs

1use std::collections::HashSet;
2
3use chrono::{Datelike, Month, NaiveDate, NaiveTime};
4use itertools::Itertools;
5use regex::Regex;
6use crate::galloc::TryAllocForExactSizeIter;
7
8use crate::value::ConstValue;
9use crate::{galloc::AllocForExactSizeIter, expr::{Expr, ops}, impl_basic, impl_op1_opt, new_op1_opt, value::Value};
10
11use super::ParsingOp;
12
13
14use chrono::Timelike;
15
16impl_basic!(ParseWeekday, "weekday.parse");
17impl crate::forward::enumeration::Enumerator1 for ParseWeekday {
18    fn enumerate(&self, this: &'static ops::Op1Enum, exec: &'static crate::forward::executor::Executor, opnt: [usize; 1]) -> Result<(), ()> { Ok(())}
19}
20
21impl_op1_opt!(ParseWeekday, "weekday.parse",
22    Str -> Int { |s1| -> Option<i64> {
23        todo!()
24    }}
25);
26
27impl ParsingOp for ParseWeekday {
28    fn parse_into(&self, input: &'static str) -> std::vec::Vec<(&'static str, ConstValue)> {
29        let months = [ "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
30        let mut result: Vec<(&'static str, ConstValue)> = Vec::new();
31        let weekday_literal = r"Sun(day)?|Mon(day)?|Tue(sday)?|Wed(nesday)?|Thu(r|rsday)?|Fri(day)?|Sat(urday)?";
32        let regex5 = Regex::new(weekday_literal.to_string().as_str()).unwrap();
33        let iter = regex5.captures_iter(input);
34        for m in iter {
35            let month = months.iter().enumerate().find(|(i, s)| ***s == m.get(0).unwrap().as_str()[0..3]).unwrap().0 as u32 + 1;
36            result.push((m.get(0).unwrap().as_str(), month.into()));
37        }
38        result
39    }
40}