num_format/
write_formatted.rs

1#![cfg(feature = "std")]
2
3use std::fmt;
4use std::io;
5
6use crate::{Format, ToFormattedString};
7
8/// <b><u>A key trait</u></b>. Gives types in the standard library that implement [`io::Write`]
9/// or [`fmt::Write`], such as `&mut [u8]` and `&mut String`, a [`write_formatted`] method for writing
10/// formatted numbers.
11///
12/// [`fmt::Write`]: https://doc.rust-lang.org/stable/std/fmt/trait.Write.html
13/// [`io::Write`]: https://doc.rust-lang.org/stable/std/io/trait.Write.html
14/// [`write_formatted`]: trait.WriteFormatted.html#method.write_formatted
15pub trait WriteFormatted {
16    /// Formats the provided number according to the provided format and then writes the resulting
17    /// bytes to the object. Meant to be analagous to [`io::Write`]'s [`write_all`] method or
18    /// [`fmt::Write`]'s [`write_str`] method. On success, returns the number of bytes written.
19    ///
20    /// # Errors
21    ///
22    /// Returns an [`io::Error`] under the same conditions as [`io::Write`]'s [`write_all`] method.
23    ///
24    /// [`fmt::Write`]: https://doc.rust-lang.org/stable/std/fmt/trait.Write.html
25    /// [`io::Error`]: https://doc.rust-lang.org/stable/std/io/struct.Error.html
26    /// [`io::Write`]: https://doc.rust-lang.org/stable/std/io/trait.Write.html
27    /// [`write_all`]: https://doc.rust-lang.org/stable/std/io/trait.Write.html#method.write_all
28    /// [`write_str`]: https://doc.rust-lang.org/stable/std/fmt/trait.Write.html#tymethod.write_str
29    fn write_formatted<F, N>(&mut self, n: &N, format: &F) -> Result<usize, io::Error>
30    where
31        F: Format,
32        N: ToFormattedString;
33}
34
35macro_rules! impl_for_fmt_write {
36    () => {
37        #[inline(always)]
38        fn write_formatted<F, N>(&mut self, n: &N, format: &F) -> Result<usize, io::Error>
39        where
40            F: Format,
41            N: ToFormattedString,
42        {
43            n.read_to_fmt_writer(self, format)
44                .map_err(|e| io::Error::new(io::ErrorKind::Other, e))
45        }
46    };
47}
48
49macro_rules! impl_for_io_write {
50    () => {
51        #[inline(always)]
52        fn write_formatted<F, N>(&mut self, n: &N, format: &F) -> Result<usize, io::Error>
53        where
54            F: Format,
55            N: ToFormattedString,
56        {
57            n.read_to_io_writer(self, format)
58        }
59    };
60}
61
62#[rustfmt::skip]
63mod any {
64    use std::fs;
65    use std::net;
66    use std::process;
67
68    use super::*;
69
70    impl<W: io::Write + ?Sized> WriteFormatted for Box<W> { impl_for_io_write!(); }
71    impl<W: io::Write> WriteFormatted for io::BufWriter<W> { impl_for_io_write!(); }
72    impl WriteFormatted for process::ChildStdin { impl_for_io_write!(); }
73    impl WriteFormatted for io::Cursor<Box<[u8]>> { impl_for_io_write!(); }
74    impl WriteFormatted for io::Cursor<Vec<u8>> { impl_for_io_write!(); }
75    impl<'a> WriteFormatted for io::Cursor<&'a mut [u8]> { impl_for_io_write!(); }
76    impl<'a> WriteFormatted for io::Cursor<&'a mut Vec<u8>> { impl_for_io_write!(); }
77    impl WriteFormatted for fs::File { impl_for_io_write!(); }
78    impl<W: io::Write> WriteFormatted for io::LineWriter<W> { impl_for_io_write!(); }
79    impl WriteFormatted for io::Sink { impl_for_io_write!(); }
80    impl WriteFormatted for io::Stderr { impl_for_io_write!(); }
81    impl WriteFormatted for io::Stdout { impl_for_io_write!(); }
82    impl WriteFormatted for String { impl_for_fmt_write!(); }
83    impl WriteFormatted for net::TcpStream { impl_for_io_write!(); }
84    impl WriteFormatted for Vec<u8> { impl_for_io_write!(); }
85    impl<'a> WriteFormatted for io::StderrLock<'a> { impl_for_io_write!(); }
86    impl<'a> WriteFormatted for io::StdoutLock<'a> { impl_for_io_write!(); }
87
88    impl<'a> WriteFormatted for &'a mut [u8] { impl_for_io_write!(); }
89    impl<'a, W: io::Write + ?Sized> WriteFormatted for &'a mut Box<W> { impl_for_io_write!(); }
90    impl<'a, W: io::Write> WriteFormatted for &'a mut io::BufWriter<W> { impl_for_io_write!(); }
91    impl<'a> WriteFormatted for &'a mut process::ChildStdin { impl_for_io_write!(); }
92    impl<'a> WriteFormatted for &'a mut io::Cursor<Box<[u8]>> { impl_for_io_write!(); }
93    impl<'a> WriteFormatted for &'a mut io::Cursor<Vec<u8>> { impl_for_io_write!(); }
94    impl<'a, 'b> WriteFormatted for &'a mut io::Cursor<&'b mut [u8]> { impl_for_io_write!(); }
95    impl<'a, 'b> WriteFormatted for &'a mut io::Cursor<&'b mut Vec<u8>> { impl_for_io_write!(); }
96    impl<'a> WriteFormatted for &'a fs::File { impl_for_io_write!(); }
97    impl<'a> WriteFormatted for &'a mut fs::File { impl_for_io_write!(); }
98    impl<'a, 'b> WriteFormatted for &'a mut fmt::Formatter<'b> { impl_for_fmt_write!(); }
99    impl<'a, W: io::Write> WriteFormatted for &'a mut io::LineWriter<W> { impl_for_io_write!(); }
100    impl<'a> WriteFormatted for &'a mut io::Sink { impl_for_io_write!(); }
101    impl<'a> WriteFormatted for &'a mut io::Stderr { impl_for_io_write!(); }
102    impl<'a> WriteFormatted for &'a mut io::Stdout { impl_for_io_write!(); }
103    impl<'a> WriteFormatted for &'a mut String { impl_for_fmt_write!(); }
104    impl<'a> WriteFormatted for &'a net::TcpStream { impl_for_io_write!(); }
105    impl<'a> WriteFormatted for &'a mut net::TcpStream { impl_for_io_write!(); }
106    impl<'a> WriteFormatted for &'a mut Vec<u8> { impl_for_io_write!(); }
107    impl<'a, 'b> WriteFormatted for &'a mut io::StderrLock<'b> { impl_for_io_write!(); }
108    impl<'a, 'b> WriteFormatted for &'a mut io::StdoutLock<'b> { impl_for_io_write!(); }
109}
110
111#[cfg(unix)]
112#[rustfmt::skip]
113mod unix {
114    use std::os::unix::net::UnixStream;
115
116    use super::*;
117
118    impl WriteFormatted for UnixStream { impl_for_io_write!(); }
119    impl<'a> WriteFormatted for &'a UnixStream { impl_for_io_write!(); }
120    impl<'a> WriteFormatted for &'a mut UnixStream { impl_for_io_write!(); }
121}