Struct SpanParser
pub struct SpanParser { /* private fields */ }
dep_jiff
and alloc
only.Expand description
A parser for Jiff’s “friendly” duration format.
See the module documentation for more details on the precise format supported by this parser.
Unlike SpanPrinter
, this parser doesn’t have any
configuration knobs. While it may grow some in the future, the approach
taken here is for the parser to support the entire grammar. That is, the
parser can parse anything emitted by SpanPrinter
. (And indeed, the
parser can even handle things that the printer can’t emit due to lack of
configurability. For example, 1hour1m
is a valid friendly duration,
but SpanPrinter
cannot emit it due to a mixing of verbose and compact
designator labels.)
§Advice
Since this parser has no configuration, there are generally only two reasons why you might want to use this type specifically:
- You need to parse from
&[u8]
. - You need to parse only the “friendly” format.
Otherwise, you can use the FromStr
implementations on both Span
and
SignedDuration
, which automatically support the friendly format in
addition to the ISO 8601 format simultaneously:
use jiff::{SignedDuration, Span, ToSpan};
let span: Span = "5 years, 2 months".parse()?;
assert_eq!(span, 5.years().months(2));
let sdur: SignedDuration = "5 hours, 2 minutes".parse()?;
assert_eq!(sdur, SignedDuration::new(5 * 60 * 60 + 2 * 60, 0));
§Example
This example shows how to parse a Span
directly from &str
:
use jiff::{fmt::friendly::SpanParser, ToSpan};
static PARSER: SpanParser = SpanParser::new();
let string = "1 year, 3 months, 15:00:01.3";
let span = PARSER.parse_span(string)?;
assert_eq!(span, 1.year().months(3).hours(15).seconds(1).milliseconds(300));
// Negative durations are supported too!
let string = "1 year, 3 months, 15:00:01.3 ago";
let span = PARSER.parse_span(string)?;
assert_eq!(span, -1.year().months(3).hours(15).seconds(1).milliseconds(300));
Implementations§
§impl SpanParser
impl SpanParser
pub const fn new() -> SpanParser
pub const fn new() -> SpanParser
Creates a new parser for the “friendly” duration format.
The parser returned uses the default configuration. (Although, at time
of writing, there are no available configuration options for this
parser.) This is identical to SpanParser::default
, but it can be used
in a const
context.
§Example
This example shows how to parse a Span
directly from &[u8]
:
use jiff::{fmt::friendly::SpanParser, ToSpan};
static PARSER: SpanParser = SpanParser::new();
let bytes = b"1 year 3 months 15 hours 1300ms";
let span = PARSER.parse_span(bytes)?;
assert_eq!(span, 1.year().months(3).hours(15).milliseconds(1300));
pub fn parse_span<I>(&self, input: I) -> Result<Span, Error> ⓘ
pub fn parse_span<I>(&self, input: I) -> Result<Span, Error> ⓘ
Run the parser on the given string (which may be plain bytes) and,
if successful, return the parsed Span
.
See the module documentation for more details on the specific grammar supported by this parser.
§Example
This shows a number of different duration formats that can be parsed
into a Span
:
use jiff::{fmt::friendly::SpanParser, ToSpan};
let spans = [
("40d", 40.days()),
("40 days", 40.days()),
("1y1d", 1.year().days(1)),
("1yr 1d", 1.year().days(1)),
("3d4h59m", 3.days().hours(4).minutes(59)),
("3 days, 4 hours, 59 minutes", 3.days().hours(4).minutes(59)),
("3d 4h 59m", 3.days().hours(4).minutes(59)),
("2h30m", 2.hours().minutes(30)),
("2h 30m", 2.hours().minutes(30)),
("1mo", 1.month()),
("1w", 1.week()),
("1 week", 1.week()),
("1w4d", 1.week().days(4)),
("1 wk 4 days", 1.week().days(4)),
("1m", 1.minute()),
("0.0021s", 2.milliseconds().microseconds(100)),
("0s", 0.seconds()),
("0d", 0.seconds()),
("0 days", 0.seconds()),
(
"1y1mo1d1h1m1.1s",
1.year().months(1).days(1).hours(1).minutes(1).seconds(1).milliseconds(100),
),
(
"1yr 1mo 1day 1hr 1min 1.1sec",
1.year().months(1).days(1).hours(1).minutes(1).seconds(1).milliseconds(100),
),
(
"1 year, 1 month, 1 day, 1 hour, 1 minute 1.1 seconds",
1.year().months(1).days(1).hours(1).minutes(1).seconds(1).milliseconds(100),
),
(
"1 year, 1 month, 1 day, 01:01:01.1",
1.year().months(1).days(1).hours(1).minutes(1).seconds(1).milliseconds(100),
),
(
"1 yr, 1 month, 1 d, 1 h, 1 min 1.1 second",
1.year().months(1).days(1).hours(1).minutes(1).seconds(1).milliseconds(100),
),
];
static PARSER: SpanParser = SpanParser::new();
for (string, span) in spans {
let parsed = PARSER.parse_span(string)?;
assert_eq!(span, parsed, "result of parsing {string:?}");
}
pub fn parse_duration<I>(&self, input: I) -> Result<SignedDuration, Error> ⓘ
pub fn parse_duration<I>(&self, input: I) -> Result<SignedDuration, Error> ⓘ
Run the parser on the given string (which may be plain bytes) and,
if successful, return the parsed SignedDuration
.
See the module documentation for more details on the specific grammar supported by this parser.
§Example
This shows a number of different duration formats that can be parsed
into a SignedDuration
:
use jiff::{fmt::friendly::SpanParser, SignedDuration};
let durations = [
("2h30m", SignedDuration::from_secs(2 * 60 * 60 + 30 * 60)),
("2 hrs 30 mins", SignedDuration::from_secs(2 * 60 * 60 + 30 * 60)),
("2 hours 30 minutes", SignedDuration::from_secs(2 * 60 * 60 + 30 * 60)),
("2 hrs 30 minutes", SignedDuration::from_secs(2 * 60 * 60 + 30 * 60)),
("2.5h", SignedDuration::from_secs(2 * 60 * 60 + 30 * 60)),
("1m", SignedDuration::from_mins(1)),
("1.5m", SignedDuration::from_secs(90)),
("0.0021s", SignedDuration::new(0, 2_100_000)),
("0s", SignedDuration::ZERO),
("0.000000001s", SignedDuration::from_nanos(1)),
];
static PARSER: SpanParser = SpanParser::new();
for (string, duration) in durations {
let parsed = PARSER.parse_duration(string)?;
assert_eq!(duration, parsed, "result of parsing {string:?}");
}
Trait Implementations§
§impl Clone for SpanParser
impl Clone for SpanParser
§fn clone(&self) -> SpanParser
fn clone(&self) -> SpanParser
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read more§impl Debug for SpanParser
impl Debug for SpanParser
§impl Default for SpanParser
impl Default for SpanParser
§fn default() -> SpanParser
fn default() -> SpanParser
Auto Trait Implementations§
impl Freeze for SpanParser
impl RefUnwindSafe for SpanParser
impl Send for SpanParser
impl Sync for SpanParser
impl Unpin for SpanParser
impl UnwindSafe for SpanParser
Blanket Implementations§
§impl<T> ArchivePointee for T
impl<T> ArchivePointee for T
§type ArchivedMetadata = ()
type ArchivedMetadata = ()
§fn pointer_metadata(
_: &<T as ArchivePointee>::ArchivedMetadata,
) -> <T as Pointee>::Metadata
fn pointer_metadata( _: &<T as ArchivePointee>::ArchivedMetadata, ) -> <T as Pointee>::Metadata
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> ByteSized for T
impl<T> ByteSized for T
Source§const BYTE_ALIGN: usize = _
const BYTE_ALIGN: usize = _
Source§fn byte_align(&self) -> usize ⓘ
fn byte_align(&self) -> usize ⓘ
Source§fn ptr_size_ratio(&self) -> [usize; 2]
fn ptr_size_ratio(&self) -> [usize; 2]
Source§impl<T, R> Chain<R> for Twhere
T: ?Sized,
impl<T, R> Chain<R> for Twhere
T: ?Sized,
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> ExtAny for T
impl<T> ExtAny for T
Source§fn as_any_mut(&mut self) -> &mut dyn Anywhere
Self: Sized,
fn as_any_mut(&mut self) -> &mut dyn Anywhere
Self: Sized,
Source§impl<T> ExtMem for Twhere
T: ?Sized,
impl<T> ExtMem for Twhere
T: ?Sized,
Source§const NEEDS_DROP: bool = _
const NEEDS_DROP: bool = _
Source§fn mem_align_of_val(&self) -> usize ⓘ
fn mem_align_of_val(&self) -> usize ⓘ
Source§fn mem_size_of_val(&self) -> usize ⓘ
fn mem_size_of_val(&self) -> usize ⓘ
Source§fn mem_needs_drop(&self) -> bool
fn mem_needs_drop(&self) -> bool
true
if dropping values of this type matters. Read moreSource§fn mem_forget(self)where
Self: Sized,
fn mem_forget(self)where
Self: Sized,
self
without running its destructor. Read moreSource§fn mem_replace(&mut self, other: Self) -> Selfwhere
Self: Sized,
fn mem_replace(&mut self, other: Self) -> Selfwhere
Self: Sized,
Source§unsafe fn mem_zeroed<T>() -> T
unsafe fn mem_zeroed<T>() -> T
unsafe_layout
only.T
represented by the all-zero byte-pattern. Read moreSource§unsafe fn mem_transmute_copy<Src, Dst>(src: &Src) -> Dst
unsafe fn mem_transmute_copy<Src, Dst>(src: &Src) -> Dst
unsafe_layout
only.T
represented by the all-zero byte-pattern. Read moreSource§fn mem_as_bytes(&self) -> &[u8] ⓘ
fn mem_as_bytes(&self) -> &[u8] ⓘ
unsafe_slice
only.§impl<S> FromSample<S> for S
impl<S> FromSample<S> for S
fn from_sample_(s: S) -> S
Source§impl<T> Hook for T
impl<T> Hook for T
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read more§impl<F, T> IntoSample<T> for Fwhere
T: FromSample<F>,
impl<F, T> IntoSample<T> for Fwhere
T: FromSample<F>,
fn into_sample(self) -> T
§impl<T> LayoutRaw for T
impl<T> LayoutRaw for T
§fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError> ⓘ
fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError> ⓘ
§impl<T, N1, N2> Niching<NichedOption<T, N1>> for N2
impl<T, N1, N2> Niching<NichedOption<T, N1>> for N2
§unsafe fn is_niched(niched: *const NichedOption<T, N1>) -> bool
unsafe fn is_niched(niched: *const NichedOption<T, N1>) -> bool
§fn resolve_niched(out: Place<NichedOption<T, N1>>)
fn resolve_niched(out: Place<NichedOption<T, N1>>)
out
indicating that a T
is niched.