2021-10-31 07:54:51 +01:00
|
|
|
use chrono::{DateTime, FixedOffset};
|
|
|
|
use nu_protocol::{ShellError, Span, Value};
|
|
|
|
|
2021-12-19 08:46:13 +01:00
|
|
|
pub fn unsupported_input_error(span: Span) -> Value {
|
2021-10-31 07:54:51 +01:00
|
|
|
Value::Error {
|
|
|
|
error: ShellError::UnsupportedInput(
|
|
|
|
String::from(
|
|
|
|
"Only dates with timezones are supported. The following formats are allowed \n
|
|
|
|
* %Y-%m-%d %H:%M:%S %z -- 2020-04-12 22:10:57 +02:00 \n
|
|
|
|
* %Y-%m-%d %H:%M:%S%.6f %z -- 2020-04-12 22:10:57.213231 +02:00 \n
|
|
|
|
* rfc3339 -- 2020-04-12T22:10:57+02:00 \n
|
|
|
|
* rfc2822 -- Tue, 1 Jul 2003 10:52:37 +0200",
|
|
|
|
),
|
2021-12-19 08:46:13 +01:00
|
|
|
span,
|
2021-10-31 07:54:51 +01:00
|
|
|
),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-12-19 08:46:13 +01:00
|
|
|
pub fn parse_date_from_string(input: String, span: Span) -> Result<DateTime<FixedOffset>, Value> {
|
2021-10-31 07:54:51 +01:00
|
|
|
let datetime = DateTime::parse_from_str(&input, "%Y-%m-%d %H:%M:%S %z"); // "2020-04-12 22:10:57 +02:00";
|
|
|
|
match datetime {
|
|
|
|
Ok(x) => Ok(x),
|
|
|
|
Err(_) => {
|
|
|
|
let datetime = DateTime::parse_from_str(&input, "%Y-%m-%d %H:%M:%S%.6f %z"); // "2020-04-12 22:10:57.213231 +02:00";
|
|
|
|
match datetime {
|
|
|
|
Ok(x) => Ok(x),
|
|
|
|
Err(_) => {
|
|
|
|
let datetime = DateTime::parse_from_rfc3339(&input); // "2020-04-12T22:10:57+02:00";
|
|
|
|
match datetime {
|
|
|
|
Ok(x) => Ok(x),
|
|
|
|
Err(_) => {
|
|
|
|
let datetime = DateTime::parse_from_rfc2822(&input); // "Tue, 1 Jul 2003 10:52:37 +0200";
|
|
|
|
match datetime {
|
|
|
|
Ok(x) => Ok(x),
|
2021-12-19 08:46:13 +01:00
|
|
|
Err(_) => Err(unsupported_input_error(span)),
|
2021-10-31 07:54:51 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|