@@ -97,7 +97,30 @@ impl<'a, I: Iterator<Item = B> + Clone, B: Borrow<Item<'a>>> DelayedFormat<I> {
97
97
DelayedFormat { date, time, off : Some ( name_and_diff) , items, locale }
98
98
}
99
99
100
- fn format ( & self , w : & mut impl Write ) -> fmt:: Result {
100
+ /// Formats `DelayedFormat` into an `std::io::Write` instance.
101
+ /// # Errors
102
+ /// This function returns an error if formatting into the `std::io::Write` instance fails.
103
+ #[ cfg( feature = "std" ) ]
104
+ pub fn format_into_io ( self , w : & mut impl std:: io:: Write ) -> fmt:: Result {
105
+ // wrapper to allow reuse of the existing string based
106
+ // writers
107
+ struct IoWriter < W : std:: io:: Write > {
108
+ writer : W ,
109
+ }
110
+ impl < W : std:: io:: Write > fmt:: Write for IoWriter < W > {
111
+ #[ inline]
112
+ fn write_str ( & mut self , s : & str ) -> fmt:: Result {
113
+ self . writer . write_all ( s. as_bytes ( ) ) . map_err ( |_| fmt:: Error )
114
+ }
115
+ }
116
+ let mut writer = IoWriter { writer : w } ;
117
+ self . format_into ( & mut writer)
118
+ }
119
+
120
+ /// Formats `DelayedFormat` into a `core::fmt::Write` instance.
121
+ /// # Errors
122
+ /// This function returns an error if formatting into the `core::fmt::Write` instance fails.
123
+ pub fn format_into ( & self , w : & mut impl Write ) -> fmt:: Result {
101
124
for item in self . items . clone ( ) {
102
125
match * item. borrow ( ) {
103
126
Item :: Literal ( s) | Item :: Space ( s) => w. write_str ( s) ,
@@ -321,7 +344,7 @@ impl<'a, I: Iterator<Item = B> + Clone, B: Borrow<Item<'a>>> DelayedFormat<I> {
321
344
impl < ' a , I : Iterator < Item = B > + Clone , B : Borrow < Item < ' a > > > Display for DelayedFormat < I > {
322
345
fn fmt ( & self , f : & mut fmt:: Formatter ) -> fmt:: Result {
323
346
let mut result = String :: new ( ) ;
324
- self . format ( & mut result) ?;
347
+ self . format_into ( & mut result) ?;
325
348
f. pad ( & result)
326
349
}
327
350
}
@@ -353,7 +376,7 @@ where
353
376
354
377
/// Formats single formatting item
355
378
#[ cfg( feature = "alloc" ) ]
356
- #[ deprecated( since = "0.4.32" , note = "Use DelayedFormat::fmt instead" ) ]
379
+ #[ deprecated( since = "0.4.32" , note = "Use DelayedFormat::fmt or DelayedFormat::format instead" ) ]
357
380
pub fn format_item (
358
381
w : & mut fmt:: Formatter ,
359
382
date : Option < & NaiveDate > ,
@@ -609,7 +632,41 @@ mod tests {
609
632
use super :: { Colons , OffsetFormat , OffsetPrecision , Pad } ;
610
633
use crate :: FixedOffset ;
611
634
#[ cfg( feature = "alloc" ) ]
612
- use crate :: { NaiveDate , NaiveTime , TimeZone , Timelike , Utc } ;
635
+ use crate :: { DateTime , NaiveDate , NaiveTime , TimeZone , Timelike , Utc } ;
636
+
637
+ #[ cfg( feature = "std" ) ]
638
+ #[ test]
639
+ fn test_delayed_format_into_io_matches_format_into ( ) {
640
+ let dt = DateTime :: from_timestamp ( 1643723400 , 123456789 ) . unwrap ( ) ;
641
+ let df = dt. format ( "%Y-%m-%d %H:%M:%S%.9f" ) ;
642
+
643
+ let mut dt_str = String :: new ( ) ;
644
+ let mut dt_vec_str = Vec :: new ( ) ;
645
+
646
+ df. format_into ( & mut dt_str) . unwrap ( ) ;
647
+ df. format_into_io ( & mut dt_vec_str) . unwrap ( ) ;
648
+
649
+ assert_eq ! ( dt_str, String :: from_utf8( dt_vec_str) . unwrap( ) ) ;
650
+ assert_eq ! ( dt_str, "2022-02-01 13:50:00.123456789" ) ;
651
+ }
652
+
653
+ #[ cfg( all( feature = "std" , feature = "unstable-locales" , feature = "alloc" ) ) ]
654
+ #[ test]
655
+ fn test_with_locale_delayed_format_into_io_matches_format_into ( ) {
656
+ use crate :: format:: locales:: Locale ;
657
+
658
+ let dt = DateTime :: from_timestamp ( 1643723400 , 123456789 ) . unwrap ( ) ;
659
+ let df = dt. format_localized ( "%A, %B %d, %Y" , Locale :: ja_JP) ;
660
+
661
+ let mut dt_str = String :: new ( ) ;
662
+ let mut dt_vec_str = Vec :: new ( ) ;
663
+
664
+ df. format_into ( & mut dt_str) . unwrap ( ) ;
665
+ df. format_into_io ( & mut dt_vec_str) . unwrap ( ) ;
666
+
667
+ assert_eq ! ( dt_str, String :: from_utf8( dt_vec_str) . unwrap( ) ) ;
668
+ assert_eq ! ( dt_str, "火曜日, 2月 01, 2022" ) ;
669
+ }
613
670
614
671
#[ test]
615
672
#[ cfg( feature = "alloc" ) ]
0 commit comments