sql_cli/data/
value_parsing.rs1use crate::data::datatable::DataValue;
3use crate::sql::functions::date_time::parse_datetime;
4
5pub fn parse_bool(s: &str) -> Option<bool> {
8 match s.to_lowercase().as_str() {
9 "true" | "t" | "yes" | "y" => Some(true),
10 "false" | "f" | "no" | "n" => Some(false),
11 "1" => Some(true),
12 "0" => Some(false),
13 _ => None,
14 }
15}
16
17pub fn parse_bool_strict(s: &str) -> Option<bool> {
20 match s.to_lowercase().as_str() {
21 "true" | "t" | "yes" | "y" => Some(true),
22 "false" | "f" | "no" | "n" => Some(false),
23 _ => None,
24 }
25}
26
27pub fn is_bool_str(s: &str) -> bool {
29 parse_bool(s).is_some()
30}
31
32pub fn is_bool_value(value: &DataValue) -> bool {
34 match value {
35 DataValue::Boolean(_) => true,
36 DataValue::String(s) => is_bool_str(s),
37 DataValue::InternedString(s) => is_bool_str(s.as_str()),
38 DataValue::Integer(i) => *i == 0 || *i == 1,
39 _ => false,
40 }
41}
42
43pub fn parse_value(field: &str, is_null: bool) -> DataValue {
47 if is_null {
49 return DataValue::Null;
50 }
51
52 if field.is_empty() {
53 return DataValue::String(String::new());
54 }
55
56 if let Some(b) = parse_bool_strict(field) {
58 return DataValue::Boolean(b);
59 }
60
61 if let Ok(i) = field.parse::<i64>() {
63 return DataValue::Integer(i);
64 }
65
66 if let Ok(f) = field.parse::<f64>() {
68 return DataValue::Float(f);
69 }
70
71 if looks_like_datetime(field) {
73 if let Ok(dt) = parse_datetime(field) {
74 return DataValue::DateTime(dt.format("%Y-%m-%d %H:%M:%S%.3f").to_string());
76 }
77 }
78
79 DataValue::String(field.to_string())
81}
82
83fn looks_like_datetime(field: &str) -> bool {
85 (field.contains('-') || field.contains('/') || field.contains('T'))
87 && field.len() >= 8 && field.len() <= 30 && !field.starts_with("--") && field.chars().filter(|c| c.is_ascii_digit()).count() >= 4 }