mod strategies;
use strategies::{try_parse_count, try_parse_json, try_parse_line_numbered};
use super::FinalAnswerFormat;
impl FinalAnswerFormat {
pub fn parse(answer: &str) -> Self {
if let Some(fmt) = try_parse_line_numbered(answer) {
return fmt;
}
if let Some(fmt) = try_parse_count(answer) {
return fmt;
}
if let Some(fmt) = try_parse_json(answer) {
return fmt;
}
Self::FreeFormText {
text: answer.to_string(),
}
}
}
pub fn extract_count_from_text(text: &str) -> Option<usize> {
static RE: std::sync::OnceLock<regex::Regex> = std::sync::OnceLock::new();
let re = RE.get_or_init(|| {
regex::Regex::new(
r"(?i)(?:found|count:?\s*)\s*(\d+)|(\d+)\s+(?:functions?|matches?|occurrences?|items?|results?)"
).expect("Invalid regex")
});
for cap in re.captures_iter(text) {
if let Some(m) = cap.get(1) {
if let Ok(n) = m.as_str().parse() {
return Some(n);
}
}
if let Some(m) = cap.get(2) {
if let Ok(n) = m.as_str().parse() {
return Some(n);
}
}
}
None
}
#[cfg(test)]
mod tests;