mirror of
https://github.com/BurntSushi/jiff.git
synced 2025-12-23 08:47:45 +00:00
Some checks failed
ci / test-default (beta, ubuntu-latest, beta) (push) Has been cancelled
ci / test-default (macos, macos-latest, stable) (push) Has been cancelled
ci / test-default (nightly, ubuntu-latest, nightly) (push) Has been cancelled
ci / test-default (stable, ubuntu-latest, stable) (push) Has been cancelled
ci / test-all (macos, macos-latest, nightly) (push) Has been cancelled
ci / test-all (nightly, ubuntu-latest, nightly) (push) Has been cancelled
ci / test-only-bundle (macos, macos-latest, nightly) (push) Has been cancelled
ci / test-only-bundle (nightly, ubuntu-latest, nightly) (push) Has been cancelled
ci / test-core (macos, macos-latest, nightly) (push) Has been cancelled
ci / test-core (nightly, ubuntu-latest, nightly) (push) Has been cancelled
ci / test-various-feature-combos (macos, macos-latest, nightly) (push) Has been cancelled
ci / test-various-feature-combos (nightly, ubuntu-latest, nightly) (push) Has been cancelled
ci / test-release (push) Has been cancelled
ci / test-doc (push) Has been cancelled
ci / test-bench (push) Has been cancelled
ci / test-fuzz (push) Has been cancelled
ci / test-miri (push) Has been cancelled
ci / win-msvc (push) Has been cancelled
ci / win-gnu (push) Has been cancelled
ci / msrv (push) Has been cancelled
ci / examples (push) Has been cancelled
ci / integrations (push) Has been cancelled
ci / time-zone-init (macos-latest) (push) Has been cancelled
ci / time-zone-init (ubuntu-24.04-arm) (push) Has been cancelled
ci / time-zone-init (ubuntu-latest) (push) Has been cancelled
ci / time-zone-init (windows-latest) (push) Has been cancelled
ci / cross (aarch64-linux-android) (push) Has been cancelled
ci / cross (aarch64-unknown-linux-gnu) (push) Has been cancelled
ci / cross (i686-unknown-linux-gnu) (push) Has been cancelled
ci / cross (powerpc-unknown-linux-gnu) (push) Has been cancelled
ci / cross (powerpc64-unknown-linux-gnu) (push) Has been cancelled
ci / cross (s390x-unknown-linux-gnu) (push) Has been cancelled
ci / cross (x86_64-linux-android) (push) Has been cancelled
ci / riscv32imc-unknown-none-elf (push) Has been cancelled
ci / wasm32-wasip1 (push) Has been cancelled
ci / wasm32-unknown-emscripten (push) Has been cancelled
ci / wasm32-unknown-uknown (push) Has been cancelled
ci / docsrs (push) Has been cancelled
ci / rustfmt (push) Has been cancelled
ci / generated (push) Has been cancelled
This was an incredibly tedious and tortuous refactor. But this removes almost all of the "create ad hoc stringly-typed errors everywhere." This partially makes progress toward #418, but my initial impetus for doing this was to see if I could reduce binary size and improve compilation times. My general target was to see if I could reduce total LLVM lines. I tested this with [Biff] using this command in the root of the Biff repo: ``` cargo llvm-lines --profile release-lto ``` Before this change, Biff had 768,596 LLVM lines. With this change, it has 757,331 lines. So... an improvement, but a very modest one. What about compilation times? This does seem to translate to---also a modest---improvement. For compiling release builds of Biff. Before: ``` $ hyperfine -w1 --prepare 'cargo clean' 'cargo b -r' Benchmark 1: cargo b -r Time (mean ± σ): 7.776 s ± 0.052 s [User: 65.876 s, System: 2.621 s] Range (min … max): 7.690 s … 7.862 s 10 runs ``` After: ``` $ hyperfine -w1 --prepare 'cargo clean' 'cargo b -r' Benchmark 1: cargo b -r Time (mean ± σ): 7.591 s ± 0.067 s [User: 65.686 s, System: 2.564 s] Range (min … max): 7.504 s … 7.689 s 10 runs ``` What about dev builds? Before: ``` $ hyperfine -w1 --prepare 'cargo clean' 'cargo b' Benchmark 1: cargo b Time (mean ± σ): 4.074 s ± 0.022 s [User: 14.493 s, System: 1.818 s] Range (min … max): 4.037 s … 4.099 s 10 runs ``` After: ``` $ hyperfine -w1 --prepare 'cargo clean' 'cargo b' Benchmark 1: cargo b Time (mean ± σ): 4.541 s ± 0.027 s [User: 15.385 s, System: 2.081 s] Range (min … max): 4.503 s … 4.591 s 10 runs ``` Well... that's disappointing. A modest improvement to release builds, but a fairly large regression in dev builds. Maybe it's because of the additional hand-written impls for new structured error types? Bah. And binary size? Normal release builds (not LTO) of Biff that were stripped were 4,431,456 bytes before this change and 4,392,064 after. Hopefully this will unlock other improvements to justify doing this. Note also that this slims down a number of error messages. [Biff]: https://github.com/BurntSushi/biff
87 lines
2.4 KiB
Rust
87 lines
2.4 KiB
Rust
use crate::{error, util::escape};
|
|
|
|
pub(crate) mod friendly;
|
|
pub(crate) mod offset;
|
|
pub(crate) mod rfc2822;
|
|
pub(crate) mod rfc9557;
|
|
pub(crate) mod strtime;
|
|
pub(crate) mod temporal;
|
|
pub(crate) mod util;
|
|
|
|
#[derive(Clone, Debug)]
|
|
pub(crate) enum Error {
|
|
HybridDurationEmpty,
|
|
HybridDurationPrefix {
|
|
sign: u8,
|
|
},
|
|
IntoFull {
|
|
#[cfg(feature = "alloc")]
|
|
value: alloc::boxed::Box<str>,
|
|
#[cfg(feature = "alloc")]
|
|
unparsed: alloc::boxed::Box<[u8]>,
|
|
},
|
|
StdFmtWriteAdapter,
|
|
}
|
|
|
|
impl Error {
|
|
pub(crate) fn into_full_error(
|
|
_value: &dyn core::fmt::Display,
|
|
_unparsed: &[u8],
|
|
) -> Error {
|
|
Error::IntoFull {
|
|
#[cfg(feature = "alloc")]
|
|
value: alloc::string::ToString::to_string(_value).into(),
|
|
#[cfg(feature = "alloc")]
|
|
unparsed: _unparsed.into(),
|
|
}
|
|
}
|
|
}
|
|
|
|
impl error::IntoError for Error {
|
|
fn into_error(self) -> error::Error {
|
|
self.into()
|
|
}
|
|
}
|
|
|
|
impl From<Error> for error::Error {
|
|
#[cold]
|
|
#[inline(never)]
|
|
fn from(err: Error) -> error::Error {
|
|
error::ErrorKind::Fmt(err).into()
|
|
}
|
|
}
|
|
|
|
impl core::fmt::Display for Error {
|
|
fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
|
|
use self::Error::*;
|
|
|
|
match *self {
|
|
HybridDurationEmpty => f.write_str(
|
|
"an empty string is not a valid duration in either \
|
|
the ISO 8601 format or Jiff's \"friendly\" format",
|
|
),
|
|
HybridDurationPrefix { sign } => write!(
|
|
f,
|
|
"found nothing after sign `{sign}`, \
|
|
which is not a valid duration in either \
|
|
the ISO 8601 format or Jiff's \"friendly\" format",
|
|
sign = escape::Byte(sign),
|
|
),
|
|
#[cfg(not(feature = "alloc"))]
|
|
IntoFull { .. } => f.write_str(
|
|
"parsed value, but unparsed input remains \
|
|
(expected no unparsed input)",
|
|
),
|
|
#[cfg(feature = "alloc")]
|
|
IntoFull { ref value, ref unparsed } => write!(
|
|
f,
|
|
"parsed value '{value}', but unparsed input {unparsed:?} \
|
|
remains (expected no unparsed input)",
|
|
unparsed = escape::Bytes(unparsed),
|
|
),
|
|
StdFmtWriteAdapter => {
|
|
f.write_str("an error occurred when formatting an argument")
|
|
}
|
|
}
|
|
}
|
|
}
|