Open loganmzz opened 7 months ago
What feature flags do you have enabled?
I use: serde
and serde-well-known
That can't be the case, as time::serde::format_description
is enabled by the macros
feature. Also note that the serde-well-known
flag is deliberately undocumented, as it is deprecated in favor of using the documented flags directly (namely serde
, formatting
, and parsing
).
Have you looked at the documentation for this macro? The final example shows how to use it with ISO 8601.
Ok, here is my test case.
Cargo.toml
:[dependencies]
serde = { version = "1.0.198", features = ["derive"] }
time = { version = "0.3.36", features = ["formatting", "macros", "parsing", "serde"] }
[dev-dependencies]
serde_json = { version = "1.0.116" }
lib.rs
:use time::{
format_description::well_known::{iso8601, Iso8601},
serde::format_description,
OffsetDateTime,
};
const CONFIG: iso8601::EncodedConfig = iso8601::Config::DEFAULT
.set_formatted_components(iso8601::FormattedComponents::DateTime)
.encode();
const FORMAT: Iso8601<CONFIG> = Iso8601::<CONFIG>;
format_description!(serde_datetime, OffsetDateTime, FORMAT);
#[derive(serde::Deserialize, Debug, PartialEq)]
pub struct Container {
#[serde(with="serde_datetime")]
pub datetime: OffsetDateTime,
}
use time::{
Date,
Month,
OffsetDateTime,
Time,
};
#[test]
fn without_offset() {
let json = serde_json::json!({
"datetime": "2024-04-17T12:45:00.0"
});
let actual: Container = serde_json::from_value(json).unwrap();
assert_eq!(
actual,
Container {
datetime: OffsetDateTime::new_utc(
Date::from_calendar_date(2024, Month::April, 17).unwrap(),
Time::from_hms(12, 45, 0).unwrap(),
),
},
);
}
Then, I got:
---- tests::without_offset stdout ----
thread 'tests::without_offset' panicked at 'called `Result::unwrap()` on an `Err` value: Error("the `Parsed` struct did not include enough information to construct the type", line: 0, column: 0)', src/lib.rs:36:62
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
Worth to mention that error isn't very explicit :/
The failure is as expected, as there is no UtcOffset
present in the formatted string. As such, an OffsetDateTime
cannot be constructed.
I will look into what can be done in terms of an error message, but I suspect there isn't much.
I wanna map "non-offset" strings against
OffsetDatetime
.I tried (sorry not provided Rust Playground links, but seems it lacks some features):
But I get following errors:
Trying to replace
Iso8601.DATE_TIME
withIso8601::DATE_TIME
, blocks macro evaluation: