Struct SpanPrinter
pub struct SpanPrinter { /* private fields */ }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§
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
§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>
§impl<T> Paint for Twhere
T: ?Sized,
impl<T> Paint for Twhere
T: ?Sized,
§fn fg(&self, value: Color) -> Painted<&T>
fn fg(&self, value: Color) -> Painted<&T>
Returns a styled value derived from self with the foreground set to
value.
This method should be used rarely. Instead, prefer to use color-specific
builder methods like red() and
green(), which have the same functionality but are
pithier.
§Example
Set foreground color to white using fg():
use yansi::{Paint, Color};
painted.fg(Color::White);Set foreground color to white using white().
use yansi::Paint;
painted.white();§fn bright_black(&self) -> Painted<&T>
fn bright_black(&self) -> Painted<&T>
§fn bright_red(&self) -> Painted<&T>
fn bright_red(&self) -> Painted<&T>
§fn bright_green(&self) -> Painted<&T>
fn bright_green(&self) -> Painted<&T>
§fn bright_yellow(&self) -> Painted<&T>
fn bright_yellow(&self) -> Painted<&T>
§fn bright_blue(&self) -> Painted<&T>
fn bright_blue(&self) -> Painted<&T>
§fn bright_magenta(&self) -> Painted<&T>
fn bright_magenta(&self) -> Painted<&T>
§fn bright_cyan(&self) -> Painted<&T>
fn bright_cyan(&self) -> Painted<&T>
§fn bright_white(&self) -> Painted<&T>
fn bright_white(&self) -> Painted<&T>
§fn bg(&self, value: Color) -> Painted<&T>
fn bg(&self, value: Color) -> Painted<&T>
Returns a styled value derived from self with the background set to
value.
This method should be used rarely. Instead, prefer to use color-specific
builder methods like on_red() and
on_green(), which have the same functionality but
are pithier.
§Example
Set background color to red using fg():
use yansi::{Paint, Color};
painted.bg(Color::Red);Set background color to red using on_red().
use yansi::Paint;
painted.on_red();§fn on_primary(&self) -> Painted<&T>
fn on_primary(&self) -> Painted<&T>
§fn on_magenta(&self) -> Painted<&T>
fn on_magenta(&self) -> Painted<&T>
§fn on_bright_black(&self) -> Painted<&T>
fn on_bright_black(&self) -> Painted<&T>
§fn on_bright_red(&self) -> Painted<&T>
fn on_bright_red(&self) -> Painted<&T>
§fn on_bright_green(&self) -> Painted<&T>
fn on_bright_green(&self) -> Painted<&T>
§fn on_bright_yellow(&self) -> Painted<&T>
fn on_bright_yellow(&self) -> Painted<&T>
§fn on_bright_blue(&self) -> Painted<&T>
fn on_bright_blue(&self) -> Painted<&T>
§fn on_bright_magenta(&self) -> Painted<&T>
fn on_bright_magenta(&self) -> Painted<&T>
§fn on_bright_cyan(&self) -> Painted<&T>
fn on_bright_cyan(&self) -> Painted<&T>
§fn on_bright_white(&self) -> Painted<&T>
fn on_bright_white(&self) -> Painted<&T>
§fn attr(&self, value: Attribute) -> Painted<&T>
fn attr(&self, value: Attribute) -> Painted<&T>
Enables the styling [Attribute] value.
This method should be used rarely. Instead, prefer to use
attribute-specific builder methods like bold() and
underline(), which have the same functionality
but are pithier.
§Example
Make text bold using attr():
use yansi::{Paint, Attribute};
painted.attr(Attribute::Bold);Make text bold using using bold().
use yansi::Paint;
painted.bold();§fn rapid_blink(&self) -> Painted<&T>
fn rapid_blink(&self) -> Painted<&T>
§fn quirk(&self, value: Quirk) -> Painted<&T>
fn quirk(&self, value: Quirk) -> Painted<&T>
Enables the yansi [Quirk] value.
This method should be used rarely. Instead, prefer to use quirk-specific
builder methods like mask() and
wrap(), which have the same functionality but are
pithier.
§Example
Enable wrapping using .quirk():
use yansi::{Paint, Quirk};
painted.quirk(Quirk::Wrap);Enable wrapping using wrap().
use yansi::Paint;
painted.wrap();§fn clear(&self) -> Painted<&T>
👎Deprecated since 1.0.1: renamed to resetting() due to conflicts with Vec::clear().
The clear() method will be removed in a future release.
fn clear(&self) -> Painted<&T>
resetting() due to conflicts with Vec::clear().
The clear() method will be removed in a future release.§fn whenever(&self, value: Condition) -> Painted<&T>
fn whenever(&self, value: Condition) -> Painted<&T>
Conditionally enable styling based on whether the [Condition] value
applies. Replaces any previous condition.
See the crate level docs for more details.
§Example
Enable styling painted only when both stdout and stderr are TTYs:
use yansi::{Paint, Condition};
painted.red().on_yellow().whenever(Condition::STDOUTERR_ARE_TTY);