Struct Error

pub struct Error { /* private fields */ }

An error that can occur in this crate.

The most common type of error is a result of overflow. But other errors exist as well:

Introspection is limited

Other than implementing the std::error::Error trait when the std feature is enabled, the core::fmt::Debug trait and the core::fmt::Display trait, this error type currently provides very limited introspection capabilities. Simple predicates like Error::is_range are provided, but the predicates are not exhaustive. That is, there exist some errors that do not return true for any of the Error::is_* predicates.

Design

This crate follows the "One True God Error Type Pattern," where only one error type exists for a variety of different operations. This design was chosen after attempting to provide finer grained error types. But finer grained error types proved difficult in the face of composition.

More about this design choice can be found in a GitHub issue about error types.

Implementations

impl Error

fn from_args<'a>(message: Arguments<'a>) -> Error

Creates a new error value from core::fmt::Arguments.

It is expected to use format_args! from Rust's standard library (available in core) to create a core::fmt::Arguments.

Callers should generally use their own error types. But in some circumstances, it can be convenient to manufacture a Jiff error value specifically.

Core-only environments

In core-only environments without a dynamic memory allocator, error messages may be degraded in some cases. For example, if the given core::fmt::Arguments could not be converted to a simple borrowed &str, then this will ignore the input given and return an "unknown" Jiff error.

Example

use jiff::Error;

let err = Error::from_args(format_args!("something failed"));
assert_eq!(err.to_string(), "something failed");
fn is_range(&self) -> bool

Returns true when this error originated as a result of a value being out of Jiff's supported range.

Example

use jiff::civil::Date;

assert!(Date::new(2025, 2, 29).unwrap_err().is_range());
assert!("2025-02-29".parse::<Date>().unwrap_err().is_range());
assert!(Date::strptime("%Y-%m-%d", "2025-02-29").unwrap_err().is_range());
fn is_invalid_parameter(&self) -> bool

Returns true when this error originated as a result of an invalid configuration of parameters to a function call.

This particular error category is somewhat nebulous, but it's generally meant to cover errors that could have been statically prevented by Jiff with more types in its API. Instead, a smaller API is preferred.

Example: invalid rounding options

use jiff::{SpanRound, ToSpan, Unit};

let span = 44.seconds();
let err = span.round(
    SpanRound::new().smallest(Unit::Second).increment(45),
).unwrap_err();
// Rounding increments for seconds must divide evenly into `60`.
// But `45` does not. Thus, this is a "configuration" error.
assert!(err.is_invalid_parameter());

Example: invalid units

One cannot round a span between dates to units less than days:

use jiff::{civil::date, Unit};

let date1 = date(2025, 3, 18);
let date2 = date(2025, 12, 21);
let err = date1.until((Unit::Hour, date2)).unwrap_err();
assert!(err.is_invalid_parameter());

Similarly, one cannot round a span between times to units greater than hours:

use jiff::{civil::time, Unit};

let time1 = time(9, 39, 0, 0);
let time2 = time(17, 0, 0, 0);
let err = time1.until((Unit::Day, time2)).unwrap_err();
assert!(err.is_invalid_parameter());
fn is_crate_feature(&self) -> bool

Returns true when this error originated as a result of an operation failing because an appropriate Jiff crate feature was not enabled.

Example

use jiff::tz::TimeZone;

// This passes when the `tz-system` crate feature is NOT enabled.
assert!(TimeZone::try_system().unwrap_err().is_crate_feature());

Trait Implementations

impl Clone for Error

fn clone(&self) -> Self

impl Debug for Error

fn fmt(&self, f: &mut Formatter<'_>) -> Result

impl Display for Error

fn fmt(&self, f: &mut Formatter<'_>) -> Result

impl Error for Error

Auto Trait Implementations

impl !RefUnwindSafe for Error

impl !UnwindSafe for Error

impl Freeze for Error

impl Send for Error

impl Sync for Error

impl Unpin for Error

impl UnsafeUnpin for Error

Blanket Implementations

impl<T> Any for Error where T: 'static + ?Sized,

fn type_id(&self) -> TypeId

impl<T> Borrow<T> for Error where T: ?Sized,

fn borrow(&self) -> &T

impl<T> BorrowMut<T> for Error where T: ?Sized,

fn borrow_mut(&mut self) -> &mut T

impl<T> CloneToUninit for Error where T: Clone,

unsafe fn clone_to_uninit(&self, dest: *mut u8)

impl<T> From<T> for Error

fn from(t: T) -> T

Returns the argument unchanged.

impl<T> ToOwned for Error where T: Clone,

type Owned = T;
fn to_owned(&self) -> T
fn clone_into(&self, target: &mut T)

impl<T> ToString for Error where T: Display + ?Sized,

fn to_string(&self) -> String

impl<T, U> Into<U> for Error where U: From<T>,

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of [From]<T> for U chooses to do.

impl<T, U> TryFrom<U> for Error where U: Into<T>,

type Error = never;
fn try_from(value: U) -> Result<T, never>

impl<T, U> TryInto<U> for Error where U: TryFrom<T>,

type Error = <U as TryFrom<T>>::Error;
fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>