Skip to main content

partial_date/
extract.rs

1//! Public extraction API.
2
3use crate::interpreter;
4use crate::models::{Day, Input, Month, PartialDate, Year};
5use crate::tokeniser;
6use crate::validator;
7
8/// Extract a partial date from the given input.
9///
10/// Returns a [`PartialDate`] where each component is either
11/// [`Extracted::Found`], [`Extracted::Defaulted`], or [`Extracted::NotFound`]
12/// depending on what could be determined from the utterance and config.
13pub 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
39/// Public re-export of the tokenise function.
40pub use crate::tokeniser::tokenise;