Join GitHub today
GitHub is home to over 31 million developers working together to host and review code, manage projects, and build software together.
Sign up`DelayedFormat` error handling is not as optimal #47
Comments
lifthrasiir
self-assigned this
Sep 5, 2015
This comment has been minimized.
This comment has been minimized.
|
Alex Crichton has confirmed that |
This comment has been minimized.
This comment has been minimized.
dashed
commented
Jul 6, 2016
|
Any progress on this? I have a usecase where format specifiers are provided by the user, and I had thought that |
This comment has been minimized.
This comment has been minimized.
|
@dashed Not yet. Recently I was busy in the daily job so I was unable to think more about this. (I do the occasional Rust hacking, but new versions of Chrono---and probably also Encoding---are blocked on several non-trivial decisions which I cannot coherently make without a lot of spare time.) I'm glad to take a PR or opinion about this. |
This comment has been minimized.
This comment has been minimized.
|
I that the best way to handle parsing user format strings is something like this: let res = StrftimeItems::new("%Y-%m-%dT%H:%M:%S%.6fZ")
.map(|item| match item {
Item::Error => Err(item),
_ => Ok(item),
})
.collect::<Result<Vec<_>, _>>();We should probably remove the |
lifthrasiir commentedSep 5, 2015
Currently an invalid formatting string gives
Item::Errorin the iterator, and it invokesstd::fmt::Erroron the actual formatting. I initially assumed that, while this does not immediately fail, a vast majority of.format()call will be followed by.to_string()or formatting macros, and they will fail loudly so the user can be easily notified during the initial test.Actually, my assumption turned out to be wrong:
std::fmt::Erroris rarely used (stdhas no use of it AFAIK) and the failure mode for it is not well-tested nor well-explored. For the striking example,ToString::to_stringwill abruptly stop at the first such error and happily return the string built up to that point. This is very surprising, and I'm yet to find the rationale for this (rust-lang/rfcs#380 and rust-lang/rfcs#504 should be relevant but they are almost silent on this). The root commit causing this traces back to 2014 and I doubt this is a consistent decision.Given this "relevation", I plan to change the error handling of
DelayedFormat. On the initial construction, it will run a copy of the item iterator and panic onItem::Error(actually,StrftimeItemsmay have a method for checking this).DelayedFormatalready requires the iterator to beCloneable so this won't cause a direct API change, but this will cause a rescanning of the format string. I guess that is not a big deal, but if it is a big deal we may have aunsafeDelayedFormatconstructor. The plan is to make this change to 0.3.