1use crate::interpreter;
4use crate::models::{Day, Input, Month, PartialDate, Year};
5use crate::tokeniser;
6use crate::validator;
7
8pub fn extract(input: Input) -> PartialDate {
14 let config = input.config.unwrap_or_default();
15 let tokens = tokeniser::tokenise(&input.utterance, &config);
16 let (day_raw, month_raw, year_raw) = interpreter::interpret_tokens(&tokens, &config);
17
18 let day_val = validator::validate_day(day_raw, &config.day);
19 let month_val = validator::validate_month(month_raw, &config.month);
20 let year_val = validator::validate_year(year_raw, &config.year);
21
22 PartialDate {
23 day: Day {
24 value: validator::apply_default(day_val, config.day.default),
25 },
26 month: Month {
27 number: validator::apply_default(month_val.map(|(n, _)| n), config.month.default),
28 name: match month_val {
29 Some((_, Some(name))) => crate::models::Extracted::Found(name),
30 _ => crate::models::Extracted::NotFound,
31 },
32 },
33 year: Year {
34 value: validator::apply_default(year_val, config.year.default),
35 },
36 }
37}
38
39pub use crate::tokeniser::tokenise;