Struct SpanPrinter
pub struct SpanPrinter { /* private fields */ }
dep_jiff
and alloc
only.Expand description
A printer for Temporal durations.
Note that in Jiff, a “Temporal duration” is called a “span.”
This printer converts an in memory representation of a duration of time
to a machine (but also human) readable format. Using this printer,
one can convert a Span
to a string. Note that a Span
provides a
Display
trait implementation that utilize the
default configuration of this printer. However, this printer can print
directly to anything that implements the fmt::Write
trait.
See the fmt::temporal
module documentation for
more information on the specific format used.
§Example
This is a basic example showing how to print a Span
directly to a
Vec<u8>
.
use jiff::{fmt::temporal::SpanPrinter, ToSpan};
// A printer can be created in a const context.
const PRINTER: SpanPrinter = SpanPrinter::new();
let span = 48.minutes();
let mut buf = vec![];
// Printing to a `Vec<u8>` can never fail.
PRINTER.print_span(&span, &mut buf).unwrap();
assert_eq!(buf, "PT48M".as_bytes());
§Example: using adapters with std::io::Write
and std::fmt::Write
By using the StdIoWrite
and
StdFmtWrite
adapters, one can print spans
directly to implementations of std::io::Write
and std::fmt::Write
,
respectively. The example below demonstrates writing to anything
that implements std::io::Write
. Similar code can be written for
std::fmt::Write
.
use std::{fs::File, io::{BufWriter, Write}, path::Path};
use jiff::{fmt::{StdIoWrite, temporal::SpanPrinter}, ToSpan};
let span = 48.minutes();
let path = Path::new("/tmp/output");
let mut file = BufWriter::new(File::create(path)?);
SpanPrinter::new().print_span(&span, StdIoWrite(&mut file)).unwrap();
file.flush()?;
assert_eq!(std::fs::read_to_string(path)?, "PT48m");
Implementations§
§impl SpanPrinter
impl SpanPrinter
pub const fn new() -> SpanPrinter
pub const fn new() -> SpanPrinter
Create a new Temporal span printer with the default configuration.
pub const fn lowercase(self, yes: bool) -> SpanPrinter
pub const fn lowercase(self, yes: bool) -> SpanPrinter
Use lowercase for unit designator labels.
By default, unit designator labels are written in uppercase.
§Example
This shows the difference between the default (uppercase) and enabling lowercase. Lowercase unit designator labels tend to be easier to read (in this author’s opinion), but they aren’t as broadly supported since they are an extension to ISO 8601.
use jiff::{fmt::temporal::SpanPrinter, ToSpan};
let span = 5.years().days(10).hours(1);
let printer = SpanPrinter::new();
assert_eq!(printer.span_to_string(&span), "P5Y10DT1H");
assert_eq!(printer.lowercase(true).span_to_string(&span), "P5y10dT1h");
pub fn span_to_string(&self, span: &Span) -> String ⓘ
pub fn span_to_string(&self, span: &Span) -> String ⓘ
Format a Span
into a string.
This is a convenience routine for SpanPrinter::print_span
with
a String
.
§Example
use jiff::{fmt::temporal::SpanPrinter, ToSpan};
const PRINTER: SpanPrinter = SpanPrinter::new();
let span = 3.years().months(5);
assert_eq!(PRINTER.span_to_string(&span), "P3Y5M");
pub fn duration_to_string(&self, duration: &SignedDuration) -> String ⓘ
pub fn duration_to_string(&self, duration: &SignedDuration) -> String ⓘ
Format a SignedDuration
into a string.
This balances the units of the duration up to at most hours automatically.
This is a convenience routine for SpanPrinter::print_duration
with
a String
.
§Example
use jiff::{fmt::temporal::SpanPrinter, SignedDuration};
const PRINTER: SpanPrinter = SpanPrinter::new();
let dur = SignedDuration::new(86_525, 123_000_789);
assert_eq!(PRINTER.duration_to_string(&dur), "PT24H2M5.123000789S");
assert_eq!(PRINTER.duration_to_string(&-dur), "-PT24H2M5.123000789S");
pub fn print_span<W>(&self, span: &Span, wtr: W) -> Result<(), Error> ⓘwhere
W: Write,
pub fn print_span<W>(&self, span: &Span, wtr: W) -> Result<(), Error> ⓘwhere
W: Write,
Print a Span
to the given writer.
§Errors
This only returns an error when writing to the given Write
implementation would fail. Some such implementations, like for String
and Vec<u8>
, never fail (unless memory allocation fails). In such
cases, it would be appropriate to call unwrap()
on the result.
§Example
use jiff::{fmt::temporal::SpanPrinter, ToSpan};
const PRINTER: SpanPrinter = SpanPrinter::new();
let span = 3.years().months(5);
let mut buf = String::new();
// Printing to a `String` can never fail.
PRINTER.print_span(&span, &mut buf).unwrap();
assert_eq!(buf, "P3Y5M");
pub fn print_duration<W>(
&self,
duration: &SignedDuration,
wtr: W,
) -> Result<(), Error> ⓘwhere
W: Write,
pub fn print_duration<W>(
&self,
duration: &SignedDuration,
wtr: W,
) -> Result<(), Error> ⓘwhere
W: Write,
Print a SignedDuration
to the given writer.
This balances the units of the duration up to at most hours automatically.
§Errors
This only returns an error when writing to the given Write
implementation would fail. Some such implementations, like for String
and Vec<u8>
, never fail (unless memory allocation fails). In such
cases, it would be appropriate to call unwrap()
on the result.
§Example
use jiff::{fmt::temporal::SpanPrinter, SignedDuration};
const PRINTER: SpanPrinter = SpanPrinter::new();
let dur = SignedDuration::new(86_525, 123_000_789);
let mut buf = String::new();
// Printing to a `String` can never fail.
PRINTER.print_duration(&dur, &mut buf).unwrap();
assert_eq!(buf, "PT24H2M5.123000789S");
// Negative durations are supported.
buf.clear();
PRINTER.print_duration(&-dur, &mut buf).unwrap();
assert_eq!(buf, "-PT24H2M5.123000789S");
Trait Implementations§
Auto Trait Implementations§
impl Freeze for SpanPrinter
impl RefUnwindSafe for SpanPrinter
impl Send for SpanPrinter
impl Sync for SpanPrinter
impl Unpin for SpanPrinter
impl UnwindSafe for SpanPrinter
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> 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.