-
Notifications
You must be signed in to change notification settings - Fork 549
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
DelayedFormat
error handling is not as optimal
#47
Comments
Alex Crichton has confirmed that |
Any progress on this? I have a usecase where format specifiers are provided by the user, and I had thought that |
@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. |
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 |
I just ran into that, it causes a |
There is explicit documentation in |
Closing in favor of #1127. |
Currently an invalid formatting string gives
Item::Error
in the iterator, and it invokesstd::fmt::Error
on 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::Error
is rarely used (std
has no use of it AFAIK) and the failure mode for it is not well-tested nor well-explored. For the striking example,ToString::to_string
will 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,StrftimeItems
may have a method for checking this).DelayedFormat
already requires the iterator to beClone
able 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 aunsafe
DelayedFormat
constructor. The plan is to make this change to 0.3.The text was updated successfully, but these errors were encountered: