changelog shortlog graph tags branches changeset files file revisions raw help

Mercurial > core / annotate rust/lib/sxp/src/fmt.rs

changeset 698: 96958d3eb5b0
parent: 0ccbbd142694
author: Richard Westhaver <ellis@rwest.io>
date: Fri, 04 Oct 2024 22:04:59 -0400
permissions: -rw-r--r--
description: fixes
8
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
1
 //! fmt.rs --- SXP Formatters
67
0ccbbd142694 rust cleanup, added rocksdb bindings
ellis <ellis@rwest.io>
parents: 8
diff changeset
2
 use crate::{
0ccbbd142694 rust cleanup, added rocksdb bindings
ellis <ellis@rwest.io>
parents: 8
diff changeset
3
   io::{self, Write},
0ccbbd142694 rust cleanup, added rocksdb bindings
ellis <ellis@rwest.io>
parents: 8
diff changeset
4
   read::Read,
0ccbbd142694 rust cleanup, added rocksdb bindings
ellis <ellis@rwest.io>
parents: 8
diff changeset
5
   tok::CharEscape,
0ccbbd142694 rust cleanup, added rocksdb bindings
ellis <ellis@rwest.io>
parents: 8
diff changeset
6
   Result,
0ccbbd142694 rust cleanup, added rocksdb bindings
ellis <ellis@rwest.io>
parents: 8
diff changeset
7
 };
8
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
8
 
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
9
 pub fn indent<W: ?Sized + io::Write>(
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
10
   wr: &mut W,
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
11
   n: usize,
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
12
   s: &[u8],
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
13
 ) -> io::Result<()> {
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
14
   for _ in 0..n {
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
15
     e!(wr.write_all(s));
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
16
   }
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
17
   Ok(())
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
18
 }
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
19
 
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
20
 pub trait WriteFormatter {
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
21
   /// Write a 'nil' value to the specified writer.
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
22
   #[inline]
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
23
   fn write_nil<W: ?Sized + Write>(&mut self, writer: &mut W) -> io::Result<()> {
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
24
     writer.write_all(b"nil")
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
25
   }
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
26
   /// Write a bool value to the specified writer.
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
27
   #[inline]
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
28
   fn write_bool<W: ?Sized + Write>(
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
29
     &mut self,
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
30
     writer: &mut W,
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
31
     value: bool,
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
32
   ) -> io::Result<()> {
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
33
     if value {
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
34
       writer.write_all(b"t")
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
35
     } else {
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
36
       writer.write_all(b"nil")
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
37
     }
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
38
   }
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
39
   /// Write an i8 value like '-123' to the specified writer.
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
40
   #[inline]
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
41
   fn write_i8<W: ?Sized + Write>(
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
42
     &mut self,
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
43
     writer: &mut W,
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
44
     value: i8,
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
45
   ) -> io::Result<()> {
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
46
     let mut buffer = itoa::Buffer::new();
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
47
     let s = buffer.format(value);
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
48
     writer.write_all(s.as_bytes())
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
49
   }
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
50
   /// Write an i16 value like '-123' to the specified writer.
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
51
   #[inline]
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
52
   fn write_i16<W: ?Sized + Write>(
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
53
     &mut self,
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
54
     writer: &mut W,
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
55
     value: i16,
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
56
   ) -> io::Result<()> {
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
57
     let mut buffer = itoa::Buffer::new();
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
58
     let s = buffer.format(value);
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
59
     writer.write_all(s.as_bytes())
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
60
   }
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
61
   /// Write an i32 value like `-123` to the specified writer.
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
62
   #[inline]
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
63
   fn write_i32<W: ?Sized + Write>(
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
64
     &mut self,
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
65
     writer: &mut W,
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
66
     value: i32,
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
67
   ) -> io::Result<()> {
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
68
     let mut buffer = itoa::Buffer::new();
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
69
     let s = buffer.format(value);
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
70
     writer.write_all(s.as_bytes())
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
71
   }
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
72
   /// Write an i64 value like `-123` to the specified writer.
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
73
   #[inline]
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
74
   fn write_i64<W: ?Sized + Write>(
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
75
     &mut self,
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
76
     writer: &mut W,
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
77
     value: i64,
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
78
   ) -> io::Result<()> {
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
79
     let mut buffer = itoa::Buffer::new();
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
80
     let s = buffer.format(value);
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
81
     writer.write_all(s.as_bytes())
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
82
   }
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
83
   /// Write an i128 value like `-123` to the specified writer.
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
84
   #[inline]
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
85
   fn write_i128<W: ?Sized + Write>(
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
86
     &mut self,
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
87
     writer: &mut W,
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
88
     value: i128,
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
89
   ) -> io::Result<()> {
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
90
     let mut buffer = itoa::Buffer::new();
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
91
     let s = buffer.format(value);
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
92
     writer.write_all(s.as_bytes())
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
93
   }
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
94
   /// Write a u8 value like `123` to the specified writer.
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
95
   #[inline]
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
96
   fn write_u8<W: ?Sized + Write>(
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
97
     &mut self,
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
98
     writer: &mut W,
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
99
     value: u8,
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
100
   ) -> io::Result<()> {
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
101
     let mut buffer = itoa::Buffer::new();
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
102
     let s = buffer.format(value);
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
103
     writer.write_all(s.as_bytes())
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
104
   }
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
105
   /// Write a u16 value like `123` to the specified writer.
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
106
   #[inline]
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
107
   fn write_u16<W: ?Sized + Write>(
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
108
     &mut self,
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
109
     writer: &mut W,
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
110
     value: u16,
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
111
   ) -> io::Result<()> {
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
112
     let mut buffer = itoa::Buffer::new();
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
113
     let s = buffer.format(value);
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
114
     writer.write_all(s.as_bytes())
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
115
   }
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
116
   /// Write a u32 value like `123` to the specified writer.
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
117
   #[inline]
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
118
   fn write_u32<W: ?Sized + Write>(
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
119
     &mut self,
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
120
     writer: &mut W,
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
121
     value: u32,
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
122
   ) -> io::Result<()> {
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
123
     let mut buffer = itoa::Buffer::new();
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
124
     let s = buffer.format(value);
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
125
     writer.write_all(s.as_bytes())
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
126
   }
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
127
   /// Write a u64 value like `123` to the specified writer.
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
128
   #[inline]
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
129
   fn write_u64<W: ?Sized + Write>(
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
130
     &mut self,
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
131
     writer: &mut W,
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
132
     value: u64,
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
133
   ) -> io::Result<()> {
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
134
     let mut buffer = itoa::Buffer::new();
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
135
     let s = buffer.format(value);
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
136
     writer.write_all(s.as_bytes())
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
137
   }
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
138
   /// Write a u128 value like `123` to the specified writer.
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
139
   #[inline]
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
140
   fn write_u128<W: ?Sized + Write>(
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
141
     &mut self,
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
142
     writer: &mut W,
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
143
     value: u128,
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
144
   ) -> io::Result<()> {
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
145
     let mut buffer = itoa::Buffer::new();
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
146
     let s = buffer.format(value);
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
147
     writer.write_all(s.as_bytes())
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
148
   }
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
149
   /// Write a f32 value like `-31.26e+12` to the specified writer.
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
150
   #[inline]
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
151
   fn write_f32<W: ?Sized + Write>(
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
152
     &mut self,
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
153
     writer: &mut W,
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
154
     value: f32,
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
155
   ) -> io::Result<()> {
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
156
     let mut buffer = ryu::Buffer::new();
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
157
     let s = buffer.format_finite(value);
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
158
     writer.write_all(s.as_bytes())
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
159
   }
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
160
   /// Write a f64 value like `-31.26e+12` to the specified writer.
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
161
   #[inline]
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
162
   fn write_f64<W: ?Sized + Write>(
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
163
     &mut self,
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
164
     writer: &mut W,
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
165
     value: f64,
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
166
   ) -> io::Result<()> {
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
167
     let mut buffer = ryu::Buffer::new();
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
168
     let s = buffer.format_finite(value);
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
169
     writer.write_all(s.as_bytes())
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
170
   }
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
171
   /// Write a number that has already been rendered to a string.
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
172
   #[inline]
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
173
   fn write_number_str<W: ?Sized + Write>(
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
174
     &mut self,
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
175
     writer: &mut W,
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
176
     value: &str,
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
177
   ) -> io::Result<()> {
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
178
     writer.write_all(value.as_bytes())
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
179
   }
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
180
   /// Called before each series of `write_string_fragment` and
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
181
   /// `write_char_escape`.  Writes a `"` to the specified writer.
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
182
   #[inline]
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
183
   fn begin_string<W: ?Sized + Write>(
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
184
     &mut self,
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
185
     writer: &mut W,
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
186
   ) -> io::Result<()> {
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
187
     writer.write_all(b"\"")
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
188
   }
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
189
   /// Called after each series of `write_string_fragment` and
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
190
   /// `write_char_escape`.  Writes a `"` to the specified writer.
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
191
   #[inline]
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
192
   fn end_string<W: ?Sized + Write>(
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
193
     &mut self,
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
194
     writer: &mut W,
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
195
   ) -> io::Result<()> {
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
196
     writer.write_all(b"\"")
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
197
   }
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
198
   /// Writes a string fragment that doesn't need any escaping to the
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
199
   /// specified writer.
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
200
   #[inline]
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
201
   fn write_string_fragment<W: ?Sized + Write>(
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
202
     &mut self,
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
203
     writer: &mut W,
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
204
     fragment: &str,
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
205
   ) -> io::Result<()> {
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
206
     writer.write_all(fragment.as_bytes())
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
207
   }
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
208
   /// Writes a character escape code to the specified writer.
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
209
   #[inline]
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
210
   fn write_char_escape<W: ?Sized + Write>(
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
211
     &mut self,
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
212
     writer: &mut W,
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
213
     char_escape: CharEscape,
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
214
   ) -> io::Result<()> {
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
215
     use self::CharEscape::*;
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
216
     let s = match char_escape {
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
217
       Quote => b"\\\"",
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
218
       ReverseSolidus => b"\\\\",
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
219
       Solidus => b"\\/",
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
220
       Backspace => b"\\b",
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
221
       FormFeed => b"\\f",
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
222
       LineFeed => b"\\n",
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
223
       CarriageReturn => b"\\r",
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
224
       Tab => b"\\t",
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
225
       AsciiControl(byte) => {
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
226
         static HEX_DIGITS: [u8; 16] = *b"0123456789abcdef";
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
227
         let bytes = &[
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
228
           b'\\',
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
229
           b'u',
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
230
           b'0',
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
231
           b'0',
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
232
           HEX_DIGITS[(byte >> 4) as usize],
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
233
           HEX_DIGITS[(byte & 0xF) as usize],
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
234
         ];
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
235
         return writer.write_all(bytes);
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
236
       }
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
237
     };
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
238
     writer.write_all(s)
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
239
   }
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
240
   #[inline]
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
241
   fn write_symbol<W: ?Sized + Write>(
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
242
     &mut self,
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
243
     writer: &mut W,
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
244
     sym: &str,
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
245
   ) -> io::Result<()> {
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
246
     writer.write_all(sym.as_bytes())
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
247
   }
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
248
   /// Called before every list.  Writes a `(` to the specified
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
249
   /// writer.
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
250
   #[inline]
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
251
   fn begin_list<W: ?Sized + Write>(
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
252
     &mut self,
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
253
     writer: &mut W,
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
254
   ) -> io::Result<()> {
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
255
     writer.write_all(b"(")
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
256
   }
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
257
   /// Called after every list.  Writes a `)` to the specified
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
258
   /// writer.
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
259
   #[inline]
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
260
   fn end_list<W: ?Sized + Write>(&mut self, writer: &mut W) -> io::Result<()> {
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
261
     writer.write_all(b")")
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
262
   }
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
263
   /// Called before every list element.  Writes a ` ` if needed to the
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
264
   /// specified writer.
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
265
   #[inline]
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
266
   fn begin_list_element<W: ?Sized + Write>(
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
267
     &mut self,
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
268
     writer: &mut W,
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
269
     car: bool,
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
270
   ) -> io::Result<()> {
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
271
     if car {
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
272
       Ok(())
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
273
     } else {
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
274
       writer.write_all(b" ")
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
275
     }
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
276
   }
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
277
   /// Called after every list element.
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
278
   #[inline]
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
279
   fn end_list_element<W: ?Sized + Write>(
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
280
     &mut self,
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
281
     _writer: &mut W,
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
282
   ) -> io::Result<()> {
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
283
     Ok(())
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
284
   }
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
285
   /// Called before every slot identifier.  Writes a `:` to the
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
286
   /// specified writer.
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
287
   #[inline]
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
288
   fn begin_key<W: ?Sized + Write>(&mut self, writer: &mut W) -> io::Result<()> {
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
289
     writer.write_all(b":")
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
290
   }
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
291
 
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
292
   /// Writes a raw JSON fragment that doesn't need any escaping to the
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
293
   /// specified writer.
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
294
   #[inline]
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
295
   fn write_raw_fragment<W: ?Sized + Write>(
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
296
     &mut self,
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
297
     writer: &mut W,
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
298
     fragment: &str,
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
299
   ) -> io::Result<()> {
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
300
     writer.write_all(fragment.as_bytes())
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
301
   }
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
302
 }
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
303
 
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
304
 /// The ReadFormatter is the sister interface to WriteFormatter.
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
305
 pub trait ReadFormatter<'r>: Read<'r> {
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
306
   #[inline]
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
307
   fn peek<R: ?Sized + Read<'r>>(
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
308
     &mut self,
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
309
     reader: &'r mut R,
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
310
   ) -> Result<Option<u8>> {
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
311
     reader.peek()
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
312
   }
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
313
 
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
314
   // /// Read a 'nil' value from the specified reader.
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
315
   // #[inline]
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
316
   // fn read_nil<R:?Sized+Read<'r>>(&mut self, reader: &'r R) -> io::Result<()>
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
317
   // {   reader
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
318
   // }
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
319
 }
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
320
 
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
321
 pub trait Formatter<'r>: ReadFormatter<'r> + WriteFormatter {}
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
322
 impl<'r, T: ReadFormatter<'r> + WriteFormatter> Formatter<'r> for T {}
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
323
 
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
324
 pub struct DefaultFormatter;
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
325
 // impl<'r> ReadFormatter<'r> for DefaultFormatter {}
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
326
 impl WriteFormatter for DefaultFormatter {}
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
327
 
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
328
 pub struct BinaryFormatter;
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
329
 // impl<'r> ReadFormatter<'r> for BinaryFormatter {}
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
330
 impl WriteFormatter for BinaryFormatter {}
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
331
 
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
332
 pub struct PrettyFormatter;
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
333
 // impl<'r> ReadFormatter<'r> for PrettyFormatter {}
1227f932b628 rust import
ellis <ellis@rwest.io>
parents:
diff changeset
334
 impl WriteFormatter for PrettyFormatter {}