✨ Add FmtSink trait and sink_fmt! macro
This commit is contained in:
1 parent
ac26dc3422
commit
ba515d4cfc
1 file changed
+32
-3
+32
-3
@@ -1,4 +1,4 @@
|
|||||||
use core::fmt;
|
use core::fmt::{self, Arguments};
|
||||||
|
|
||||||
pub trait StrSink {
|
pub trait StrSink {
|
||||||
type Error;
|
type Error;
|
||||||
@@ -29,17 +29,37 @@ where
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub trait FmtSink: StrSink {
|
||||||
|
fn sink_fmt<'a>(&mut self, args: Arguments<'a>) -> Result<(), <Self as StrSink>::Error>;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<W> FmtSink for W
|
||||||
|
where
|
||||||
|
W: fmt::Write,
|
||||||
|
{
|
||||||
|
fn sink_fmt<'a>(&mut self, args: Arguments<'a>) -> Result<(), <Self as StrSink>::Error> {
|
||||||
|
self.write_fmt(args)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[macro_export]
|
||||||
|
macro_rules! sink_fmt {
|
||||||
|
($dst:expr, $($arg:tt)*) => {
|
||||||
|
FmtSink::sink_fmt($dst, core::format_args!($($arg)*))
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(feature = "alloc")]
|
#[cfg(feature = "alloc")]
|
||||||
pub use string_sink::SinkString;
|
pub use string_sink::SinkString;
|
||||||
|
|
||||||
#[cfg(feature = "alloc")]
|
#[cfg(feature = "alloc")]
|
||||||
mod string_sink {
|
mod string_sink {
|
||||||
use core::convert::Infallible;
|
use core::{convert::Infallible, fmt::{self, Arguments}};
|
||||||
|
|
||||||
#[cfg(not(feature = "std"))]
|
#[cfg(not(feature = "std"))]
|
||||||
use alloc::string::String;
|
use alloc::string::String;
|
||||||
|
|
||||||
use super::StrSink;
|
use super::{StrSink, FmtSink};
|
||||||
|
|
||||||
#[repr(transparent)]
|
#[repr(transparent)]
|
||||||
#[derive(Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Debug)]
|
#[derive(Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Debug)]
|
||||||
@@ -94,4 +114,13 @@ mod string_sink {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl FmtSink for SinkString {
|
||||||
|
fn sink_fmt<'a>(&mut self, args: Arguments<'a>) -> Result<(), <Self as StrSink>::Error> {
|
||||||
|
// We discard any error, since writing to a `String` should be infallible for correct
|
||||||
|
// implementations of `Display` etc.
|
||||||
|
let _ = <String as fmt::Write>::write_fmt(&mut self.0, args);
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Reference in new issue
Block a user