Coverage Report

Created: 2025-12-31 06:22

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/rust/registry/src/index.crates.io-1949cf8c6b5b557f/sval_buffer-2.16.0/src/value.rs
Line
Count
Source
1
use crate::{
2
    std::{
3
        marker::PhantomData,
4
        mem,
5
        ops::{Deref, DerefMut, Range},
6
    },
7
    BinaryBuf, Error, TextBuf,
8
};
9
10
use sval_ref::ValueRef as _;
11
12
#[derive(Debug, Clone)]
13
struct BufMut<T, const N: usize> {
14
    #[cfg(feature = "alloc")]
15
    inner: crate::std::vec::Vec<T>,
16
    #[cfg(not(feature = "alloc"))]
17
    inner: array_vec::ArrayVec<T, N>,
18
}
19
20
impl<T, const N: usize> Default for BufMut<T, N> {
21
0
    fn default() -> Self {
22
0
        BufMut {
23
0
            inner: Default::default(),
24
0
        }
25
0
    }
Unexecuted instantiation: <sval_buffer::value::BufMut<sval_buffer::value::ValuePart, 1> as core::default::Default>::default
Unexecuted instantiation: <sval_buffer::value::BufMut<usize, 1> as core::default::Default>::default
26
}
27
28
impl<T, const N: usize> Deref for BufMut<T, N> {
29
    type Target = [T];
30
31
0
    fn deref(&self) -> &Self::Target {
32
0
        &self.inner
33
0
    }
Unexecuted instantiation: <sval_buffer::value::BufMut<sval_buffer::value::ValuePart, 1> as core::ops::deref::Deref>::deref
Unexecuted instantiation: <sval_buffer::value::BufMut<usize, 1> as core::ops::deref::Deref>::deref
34
}
35
36
impl<T, const N: usize> DerefMut for BufMut<T, N> {
37
0
    fn deref_mut(&mut self) -> &mut Self::Target {
38
0
        &mut self.inner
39
0
    }
40
}
41
42
impl<T, const N: usize> BufMut<T, N> {
43
0
    fn push(&mut self, value: T) -> Result<(), Error> {
44
        #[cfg(feature = "alloc")]
45
        {
46
0
            self.inner.push(value);
47
48
0
            Ok(())
49
        }
50
        #[cfg(not(feature = "alloc"))]
51
        {
52
            self.inner.push(value)
53
        }
54
0
    }
Unexecuted instantiation: <sval_buffer::value::BufMut<sval_buffer::value::ValuePart, 1>>::push
Unexecuted instantiation: <sval_buffer::value::BufMut<usize, 1>>::push
55
56
0
    fn pop(&mut self) -> Option<T> {
57
0
        self.inner.pop()
58
0
    }
59
60
0
    fn clear(&mut self) {
61
0
        self.inner.clear()
62
0
    }
Unexecuted instantiation: <sval_buffer::value::BufMut<sval_buffer::value::ValuePart, 1>>::clear
Unexecuted instantiation: <sval_buffer::value::BufMut<usize, 1>>::clear
63
}
64
65
#[derive(Debug, Clone)]
66
struct Buf<T, const N: usize> {
67
    #[cfg(feature = "alloc")]
68
    inner: crate::std::boxed::Box<[T]>,
69
    #[cfg(not(feature = "alloc"))]
70
    inner: array_vec::ArrayVec<T, N>,
71
}
72
73
impl<T, const N: usize> Deref for Buf<T, N> {
74
    type Target = [T];
75
76
0
    fn deref(&self) -> &Self::Target {
77
0
        &self.inner
78
0
    }
Unexecuted instantiation: <sval_buffer::value::Buf<sval_buffer::value::ValuePart, 1> as core::ops::deref::Deref>::deref
Unexecuted instantiation: <sval_buffer::value::Buf<_, _> as core::ops::deref::Deref>::deref
79
}
80
81
impl<T, const N: usize> DerefMut for Buf<T, N> {
82
0
    fn deref_mut(&mut self) -> &mut Self::Target {
83
0
        &mut self.inner
84
0
    }
85
}
86
87
impl<T, const N: usize> From<BufMut<T, N>> for Buf<T, N> {
88
0
    fn from(value: BufMut<T, N>) -> Self {
89
        #[cfg(feature = "alloc")]
90
        {
91
0
            Buf {
92
0
                inner: value.inner.into_boxed_slice(),
93
0
            }
94
        }
95
        #[cfg(not(feature = "alloc"))]
96
        {
97
            Buf { inner: value.inner }
98
        }
99
0
    }
100
}
101
102
/**
103
Buffer arbitrary values into a tree-like structure.
104
105
This type requires the `alloc` or `std` features, otherwise most methods
106
will fail.
107
*/
108
#[derive(Debug)]
109
pub struct ValueBuf<'sval> {
110
    parts: BufMut<ValuePart<'sval>, 1>,
111
    stack: BufMut<usize, 1>,
112
    is_in_text_or_binary: bool,
113
    err: Option<Error>,
114
    _marker: PhantomData<&'sval ()>,
115
}
116
117
/**
118
An immutable buffered value.
119
120
This type is more compact than `ValueBuf`.
121
*/
122
#[derive(Debug, Clone)]
123
pub struct Value<'sval> {
124
    parts: Buf<ValuePart<'sval>, 1>,
125
    _marker: PhantomData<&'sval ()>,
126
}
127
128
impl<'sval> Default for ValueBuf<'sval> {
129
0
    fn default() -> Self {
130
0
        ValueBuf::new()
131
0
    }
132
}
133
134
impl<'sval> ValueBuf<'sval> {
135
    /**
136
    Create a new empty value buffer.
137
    */
138
0
    pub fn new() -> Self {
139
0
        ValueBuf {
140
0
            parts: Default::default(),
141
0
            stack: Default::default(),
142
0
            is_in_text_or_binary: false,
143
0
            err: None,
144
0
            _marker: PhantomData,
145
0
        }
146
0
    }
147
148
    /**
149
    Buffer a value.
150
151
    This method will fail if the `alloc` feature is not enabled.
152
    */
153
0
    pub fn collect(v: &'sval (impl sval::Value + ?Sized)) -> Result<Self, Error> {
154
0
        let mut buf = ValueBuf::new();
155
156
0
        match v.stream(&mut buf) {
157
0
            Ok(()) => Ok(buf),
158
0
            Err(_) => Err(buf
159
0
                .into_err()
160
0
                .unwrap_or_else(|| Error::invalid_value("the value itself failed to stream"))),
161
        }
162
0
    }
163
164
    /**
165
    Whether or not the contents of the value buffer are complete.
166
    */
167
0
    pub fn is_complete(&self) -> bool {
168
0
        self.stack.len() == 0 && self.parts.len() > 0 && !self.is_in_text_or_binary
169
0
    }
170
171
    /**
172
    Clear this buffer so it can be re-used for future values.
173
    */
174
0
    pub fn clear(&mut self) {
175
        let ValueBuf {
176
0
            parts,
177
0
            stack,
178
0
            is_in_text_or_binary,
179
0
            err,
180
0
            _marker,
181
0
        } = self;
182
183
0
        parts.clear();
184
0
        stack.clear();
185
0
        *is_in_text_or_binary = false;
186
0
        *err = None;
187
0
    }
188
189
    /**
190
    Get an independent immutable value from this buffer.
191
    */
192
0
    pub fn to_value(&self) -> Value<'sval> {
193
0
        Value {
194
0
            parts: self.parts.clone().into(),
195
0
            _marker: PhantomData,
196
0
        }
197
0
    }
198
199
    /**
200
    Convert this buffer into an immutable value.
201
    */
202
0
    pub fn into_value(self) -> Value<'sval> {
203
0
        Value {
204
0
            parts: self.parts.into(),
205
0
            _marker: PhantomData,
206
0
        }
207
0
    }
208
209
    /**
210
    Fully buffer any borrowed data, returning a buffer that doesn't borrow anything.
211
212
    This method will fail if the `alloc` feature is not enabled.
213
    */
214
0
    pub fn into_owned(self) -> Result<ValueBuf<'static>, Error> {
215
        #[cfg(feature = "alloc")]
216
        {
217
            let ValueBuf {
218
0
                mut parts,
219
0
                mut stack,
220
0
                mut is_in_text_or_binary,
221
0
                mut err,
222
0
                _marker,
223
0
            } = self;
224
225
            // Re-assign all parts within the value in-place without re-allocating for them
226
            // This will take care of converted any actually borrowed data into owned
227
0
            for part in parts.iter_mut() {
228
0
                crate::assert_static(part.into_owned_in_place());
229
0
            }
230
231
            // SAFETY: `parts` no longer contains any data borrowed for `'sval`
232
0
            let mut parts = unsafe {
233
0
                mem::transmute::<BufMut<ValuePart<'sval>, 1>, BufMut<ValuePart<'static>, 1>>(parts)
234
            };
235
236
0
            crate::assert_static(&mut parts);
237
0
            crate::assert_static(&mut stack);
238
0
            crate::assert_static(&mut is_in_text_or_binary);
239
0
            crate::assert_static(&mut err);
240
241
0
            Ok(ValueBuf {
242
0
                parts,
243
0
                stack,
244
0
                is_in_text_or_binary,
245
0
                err,
246
0
                _marker: PhantomData,
247
0
            })
248
        }
249
        #[cfg(not(feature = "alloc"))]
250
        {
251
            Err(Error::no_alloc("owned value"))
252
        }
253
0
    }
254
255
0
    fn try_catch(
256
0
        &mut self,
257
0
        f: impl FnOnce(&mut ValueBuf<'sval>) -> Result<(), Error>,
258
0
    ) -> sval::Result {
259
0
        match f(self) {
260
0
            Ok(()) => Ok(()),
261
0
            Err(e) => self.fail(e),
262
        }
263
0
    }
Unexecuted instantiation: <sval_buffer::value::ValueBuf>::try_catch::<<sval_buffer::value::ValueBuf as sval::stream::Stream>::enum_begin::{closure#0}>
Unexecuted instantiation: <sval_buffer::value::ValueBuf>::try_catch::<<sval_buffer::value::ValueBuf as sval::stream::Stream>::record_end::{closure#0}>
Unexecuted instantiation: <sval_buffer::value::ValueBuf>::try_catch::<<sval_buffer::value::ValueBuf as sval::stream::Stream>::tagged_end::{closure#0}>
Unexecuted instantiation: <sval_buffer::value::ValueBuf>::try_catch::<<sval_buffer::value::ValueBuf as sval::stream::Stream>::text_begin::{closure#0}>
Unexecuted instantiation: <sval_buffer::value::ValueBuf>::try_catch::<<sval_buffer::value::ValueBuf as sval::stream::Stream>::map_key_end::{closure#0}>
Unexecuted instantiation: <sval_buffer::value::ValueBuf>::try_catch::<<sval_buffer::value::ValueBuf as sval::stream::Stream>::tuple_begin::{closure#0}>
Unexecuted instantiation: <sval_buffer::value::ValueBuf>::try_catch::<<sval_buffer::value::ValueBuf as sval::stream::Stream>::binary_begin::{closure#0}>
Unexecuted instantiation: <sval_buffer::value::ValueBuf>::try_catch::<<sval_buffer::value::ValueBuf as sval::stream::Stream>::record_begin::{closure#0}>
Unexecuted instantiation: <sval_buffer::value::ValueBuf>::try_catch::<<sval_buffer::value::ValueBuf as sval::stream::Stream>::tagged_begin::{closure#0}>
Unexecuted instantiation: <sval_buffer::value::ValueBuf>::try_catch::<<sval_buffer::value::ValueBuf as sval::stream::Stream>::map_key_begin::{closure#0}>
Unexecuted instantiation: <sval_buffer::value::ValueBuf>::try_catch::<<sval_buffer::value::ValueBuf as sval::stream::Stream>::map_value_end::{closure#0}>
Unexecuted instantiation: <sval_buffer::value::ValueBuf>::try_catch::<<sval_buffer::value::ValueBuf as sval::stream::Stream>::seq_value_end::{closure#0}>
Unexecuted instantiation: <sval_buffer::value::ValueBuf>::try_catch::<<sval_buffer::value::ValueBuf as sval::stream::Stream>::text_fragment::{closure#0}>
Unexecuted instantiation: <sval_buffer::value::ValueBuf>::try_catch::<<sval_buffer::value::ValueBuf as sval::stream::Stream>::binary_fragment::{closure#0}>
Unexecuted instantiation: <sval_buffer::value::ValueBuf>::try_catch::<<sval_buffer::value::ValueBuf as sval::stream::Stream>::map_value_begin::{closure#0}>
Unexecuted instantiation: <sval_buffer::value::ValueBuf>::try_catch::<<sval_buffer::value::ValueBuf as sval::stream::Stream>::seq_value_begin::{closure#0}>
Unexecuted instantiation: <sval_buffer::value::ValueBuf>::try_catch::<<sval_buffer::value::ValueBuf as sval::stream::Stream>::tuple_value_end::{closure#0}>
Unexecuted instantiation: <sval_buffer::value::ValueBuf>::try_catch::<<sval_buffer::value::ValueBuf as sval::stream::Stream>::record_tuple_end::{closure#0}>
Unexecuted instantiation: <sval_buffer::value::ValueBuf>::try_catch::<<sval_buffer::value::ValueBuf as sval::stream::Stream>::record_value_end::{closure#0}>
Unexecuted instantiation: <sval_buffer::value::ValueBuf>::try_catch::<<sval_buffer::value::ValueBuf as sval::stream::Stream>::tuple_value_begin::{closure#0}>
Unexecuted instantiation: <sval_buffer::value::ValueBuf>::try_catch::<<sval_buffer::value::ValueBuf as sval::stream::Stream>::record_tuple_begin::{closure#0}>
Unexecuted instantiation: <sval_buffer::value::ValueBuf>::try_catch::<<sval_buffer::value::ValueBuf as sval::stream::Stream>::record_value_begin::{closure#0}>
Unexecuted instantiation: <sval_buffer::value::ValueBuf>::try_catch::<<sval_buffer::value::ValueBuf as sval::stream::Stream>::record_tuple_value_end::{closure#0}>
Unexecuted instantiation: <sval_buffer::value::ValueBuf>::try_catch::<<sval_buffer::value::ValueBuf as sval::stream::Stream>::text_fragment_computed::{closure#0}>
Unexecuted instantiation: <sval_buffer::value::ValueBuf>::try_catch::<<sval_buffer::value::ValueBuf as sval::stream::Stream>::binary_fragment_computed::{closure#0}>
Unexecuted instantiation: <sval_buffer::value::ValueBuf>::try_catch::<<sval_buffer::value::ValueBuf as sval::stream::Stream>::record_tuple_value_begin::{closure#0}>
Unexecuted instantiation: <sval_buffer::value::ValueBuf>::try_catch::<<sval_buffer::value::ValueBuf as sval::stream::Stream>::i8::{closure#0}>
Unexecuted instantiation: <sval_buffer::value::ValueBuf>::try_catch::<<sval_buffer::value::ValueBuf as sval::stream::Stream>::u8::{closure#0}>
Unexecuted instantiation: <sval_buffer::value::ValueBuf>::try_catch::<<sval_buffer::value::ValueBuf as sval::stream::Stream>::f32::{closure#0}>
Unexecuted instantiation: <sval_buffer::value::ValueBuf>::try_catch::<<sval_buffer::value::ValueBuf as sval::stream::Stream>::f64::{closure#0}>
Unexecuted instantiation: <sval_buffer::value::ValueBuf>::try_catch::<<sval_buffer::value::ValueBuf as sval::stream::Stream>::i16::{closure#0}>
Unexecuted instantiation: <sval_buffer::value::ValueBuf>::try_catch::<<sval_buffer::value::ValueBuf as sval::stream::Stream>::i32::{closure#0}>
Unexecuted instantiation: <sval_buffer::value::ValueBuf>::try_catch::<<sval_buffer::value::ValueBuf as sval::stream::Stream>::i64::{closure#0}>
Unexecuted instantiation: <sval_buffer::value::ValueBuf>::try_catch::<<sval_buffer::value::ValueBuf as sval::stream::Stream>::tag::{closure#0}>
Unexecuted instantiation: <sval_buffer::value::ValueBuf>::try_catch::<<sval_buffer::value::ValueBuf as sval::stream::Stream>::u16::{closure#0}>
Unexecuted instantiation: <sval_buffer::value::ValueBuf>::try_catch::<<sval_buffer::value::ValueBuf as sval::stream::Stream>::u32::{closure#0}>
Unexecuted instantiation: <sval_buffer::value::ValueBuf>::try_catch::<<sval_buffer::value::ValueBuf as sval::stream::Stream>::u64::{closure#0}>
Unexecuted instantiation: <sval_buffer::value::ValueBuf>::try_catch::<<sval_buffer::value::ValueBuf as sval::stream::Stream>::bool::{closure#0}>
Unexecuted instantiation: <sval_buffer::value::ValueBuf>::try_catch::<<sval_buffer::value::ValueBuf as sval::stream::Stream>::i128::{closure#0}>
Unexecuted instantiation: <sval_buffer::value::ValueBuf>::try_catch::<<sval_buffer::value::ValueBuf as sval::stream::Stream>::null::{closure#0}>
Unexecuted instantiation: <sval_buffer::value::ValueBuf>::try_catch::<<sval_buffer::value::ValueBuf as sval::stream::Stream>::u128::{closure#0}>
Unexecuted instantiation: <sval_buffer::value::ValueBuf>::try_catch::<<sval_buffer::value::ValueBuf as sval::stream::Stream>::map_end::{closure#0}>
Unexecuted instantiation: <sval_buffer::value::ValueBuf>::try_catch::<<sval_buffer::value::ValueBuf as sval::stream::Stream>::seq_end::{closure#0}>
Unexecuted instantiation: <sval_buffer::value::ValueBuf>::try_catch::<<sval_buffer::value::ValueBuf as sval::stream::Stream>::enum_end::{closure#0}>
Unexecuted instantiation: <sval_buffer::value::ValueBuf>::try_catch::<<sval_buffer::value::ValueBuf as sval::stream::Stream>::tag_hint::{closure#0}>
Unexecuted instantiation: <sval_buffer::value::ValueBuf>::try_catch::<<sval_buffer::value::ValueBuf as sval::stream::Stream>::map_begin::{closure#0}>
Unexecuted instantiation: <sval_buffer::value::ValueBuf>::try_catch::<<sval_buffer::value::ValueBuf as sval::stream::Stream>::seq_begin::{closure#0}>
Unexecuted instantiation: <sval_buffer::value::ValueBuf>::try_catch::<<sval_buffer::value::ValueBuf as sval::stream::Stream>::tuple_end::{closure#0}>
264
265
0
    fn fail(&mut self, err: Error) -> sval::Result {
266
0
        self.err = Some(err);
267
0
        sval::error()
268
0
    }
269
270
    /**
271
    Take an error produced while attempting to buffer a value.
272
273
    This method may return `None` even if streaming failed if a value failed
274
    without ever calling into the buffer.
275
    */
276
0
    pub fn into_err(self) -> Option<Error> {
277
0
        self.err
278
0
    }
279
}
280
281
impl ValueBuf<'static> {
282
    /**
283
    Fully buffer a value, including any internal borrowed data.
284
285
    This method will fail if the `alloc` feature is not enabled.
286
    */
287
0
    pub fn collect_owned(v: impl sval::Value) -> Result<Self, Error> {
288
0
        let mut buf = ValueBuf::new();
289
290
        // Buffering the value as computed means any borrowed data will
291
        // have to be converted into owned anyways
292
0
        match sval::stream_computed(&mut buf, v) {
293
0
            Ok(()) => Ok(buf),
294
0
            Err(_) => Err(buf
295
0
                .into_err()
296
0
                .unwrap_or_else(|| Error::invalid_value("the value itself failed to stream"))),
Unexecuted instantiation: <sval_buffer::value::ValueBuf>::collect_owned::<&dyn sval_dynamic::value::Value>::{closure#0}
Unexecuted instantiation: <sval_buffer::value::ValueBuf>::collect_owned::<_>::{closure#0}
297
        }
298
0
    }
Unexecuted instantiation: <sval_buffer::value::ValueBuf>::collect_owned::<&dyn sval_dynamic::value::Value>
Unexecuted instantiation: <sval_buffer::value::ValueBuf>::collect_owned::<_>
299
}
300
301
impl<'sval> Value<'sval> {
302
    /**
303
    Buffer a value.
304
305
    This method will fail if the `alloc` feature is not enabled.
306
    */
307
0
    pub fn collect(v: &'sval (impl sval::Value + ?Sized)) -> Result<Self, Error> {
308
0
        ValueBuf::collect(v).map(|buf| buf.into_value())
309
0
    }
310
311
    /**
312
    Fully buffer this value, including any internal borrowed data.
313
314
    This method will fail if the `alloc` feature is not enabled.
315
    */
316
0
    pub fn into_owned(self) -> Result<Value<'static>, Error> {
317
        #[cfg(feature = "alloc")]
318
        {
319
0
            let Value { mut parts, _marker } = self;
320
321
            // Re-assign all parts within the value in-place without re-allocating for them
322
            // This will take care of converted any actually borrowed data into owned
323
0
            for part in parts.iter_mut() {
324
0
                crate::assert_static(part.into_owned_in_place());
325
0
            }
326
327
            // SAFETY: `parts` no longer contains any data borrowed for `'sval`
328
0
            let mut parts = unsafe {
329
0
                mem::transmute::<Buf<ValuePart<'sval>, 1>, Buf<ValuePart<'static>, 1>>(parts)
330
            };
331
0
            crate::assert_static(&mut parts);
332
333
0
            Ok(Value {
334
0
                parts,
335
0
                _marker: PhantomData,
336
0
            })
337
        }
338
        #[cfg(not(feature = "alloc"))]
339
        {
340
            Err(Error::no_alloc("owned value"))
341
        }
342
0
    }
343
}
344
345
impl Value<'static> {
346
    /**
347
    Fully buffer a value, including any internal borrowed data.
348
349
    This method will fail if the `alloc` feature is not enabled.
350
    */
351
0
    pub fn collect_owned(v: impl sval::Value) -> Result<Self, Error> {
352
0
        ValueBuf::collect_owned(v).map(|buf| buf.into_value())
Unexecuted instantiation: <sval_buffer::value::Value>::collect_owned::<&dyn sval_dynamic::value::Value>::{closure#0}
Unexecuted instantiation: <sval_buffer::value::Value>::collect_owned::<_>::{closure#0}
353
0
    }
Unexecuted instantiation: <sval_buffer::value::Value>::collect_owned::<&dyn sval_dynamic::value::Value>
Unexecuted instantiation: <sval_buffer::value::Value>::collect_owned::<_>
354
}
355
356
impl<'a> sval::Value for ValueBuf<'a> {
357
0
    fn stream<'sval, S: sval::Stream<'sval> + ?Sized>(&'sval self, stream: &mut S) -> sval::Result {
358
0
        self.stream_ref(stream)
359
0
    }
360
}
361
362
impl<'sval> sval_ref::ValueRef<'sval> for ValueBuf<'sval> {
363
0
    fn stream_ref<S: sval::Stream<'sval> + ?Sized>(&self, stream: &mut S) -> sval::Result {
364
0
        stream_ref(&self.parts, stream)
365
0
    }
366
}
367
368
impl<'a> sval::Value for Value<'a> {
369
0
    fn stream<'sval, S: sval::Stream<'sval> + ?Sized>(&'sval self, stream: &mut S) -> sval::Result {
370
0
        self.stream_ref(stream)
371
0
    }
Unexecuted instantiation: <sval_buffer::value::Value as sval::value::Value>::stream::<dyn sval_dynamic::stream::Stream>
Unexecuted instantiation: <sval_buffer::value::Value as sval::value::Value>::stream::<sval::value::default_value::tag::Extract>
Unexecuted instantiation: <sval_buffer::value::Value as sval::value::Value>::stream::<sval::value::default_value::to_f32::Extract>
Unexecuted instantiation: <sval_buffer::value::Value as sval::value::Value>::stream::<sval::value::default_value::to_f64::Extract>
Unexecuted instantiation: <sval_buffer::value::Value as sval::value::Value>::stream::<sval::value::default_value::to_bool::Extract>
Unexecuted instantiation: <sval_buffer::value::Value as sval::value::Value>::stream::<sval::value::default_value::to_i128::Extract>
Unexecuted instantiation: <sval_buffer::value::Value as sval::value::Value>::stream::<sval::value::default_value::to_text::Extract>
Unexecuted instantiation: <sval_buffer::value::Value as sval::value::Value>::stream::<sval::value::default_value::to_u128::Extract>
Unexecuted instantiation: <sval_buffer::value::Value as sval::value::Value>::stream::<sval::value::default_value::to_binary::Extract>
Unexecuted instantiation: <sval_buffer::value::Value as sval::value::Value>::stream::<_>
372
}
373
374
impl<'sval> sval_ref::ValueRef<'sval> for Value<'sval> {
375
0
    fn stream_ref<S: sval::Stream<'sval> + ?Sized>(&self, stream: &mut S) -> sval::Result {
376
0
        stream_ref(&self.parts, stream)
377
0
    }
Unexecuted instantiation: <sval_buffer::value::Value as sval_ref::ValueRef>::stream_ref::<dyn sval_dynamic::stream::Stream>
Unexecuted instantiation: <sval_buffer::value::Value as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::tag::Extract>
Unexecuted instantiation: <sval_buffer::value::Value as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_f32::Extract>
Unexecuted instantiation: <sval_buffer::value::Value as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_f64::Extract>
Unexecuted instantiation: <sval_buffer::value::Value as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_bool::Extract>
Unexecuted instantiation: <sval_buffer::value::Value as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_i128::Extract>
Unexecuted instantiation: <sval_buffer::value::Value as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_text::Extract>
Unexecuted instantiation: <sval_buffer::value::Value as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_u128::Extract>
Unexecuted instantiation: <sval_buffer::value::Value as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_binary::Extract>
Unexecuted instantiation: <sval_buffer::value::Value as sval_ref::ValueRef>::stream_ref::<_>
378
}
379
380
0
fn stream_ref<'a, 'sval, S: sval::Stream<'sval> + ?Sized>(
381
0
    parts: &'a [ValuePart<'sval>],
382
0
    stream: &mut S,
383
0
) -> sval::Result {
384
    // If the buffer is empty then stream null
385
0
    if parts.len() == 0 {
386
0
        return stream.null();
387
0
    }
388
389
0
    ValueSlice::new(parts).stream_ref(stream)
390
0
}
Unexecuted instantiation: sval_buffer::value::stream_ref::<dyn sval_dynamic::stream::Stream>
Unexecuted instantiation: sval_buffer::value::stream_ref::<sval::value::default_value::tag::Extract>
Unexecuted instantiation: sval_buffer::value::stream_ref::<sval::value::default_value::to_f32::Extract>
Unexecuted instantiation: sval_buffer::value::stream_ref::<sval::value::default_value::to_f64::Extract>
Unexecuted instantiation: sval_buffer::value::stream_ref::<sval::value::default_value::to_bool::Extract>
Unexecuted instantiation: sval_buffer::value::stream_ref::<sval::value::default_value::to_i128::Extract>
Unexecuted instantiation: sval_buffer::value::stream_ref::<sval::value::default_value::to_text::Extract>
Unexecuted instantiation: sval_buffer::value::stream_ref::<sval::value::default_value::to_u128::Extract>
Unexecuted instantiation: sval_buffer::value::stream_ref::<sval::value::default_value::to_binary::Extract>
Unexecuted instantiation: sval_buffer::value::stream_ref::<_>
391
392
impl<'sval> sval::Stream<'sval> for ValueBuf<'sval> {
393
0
    fn null(&mut self) -> sval::Result {
394
0
        self.try_catch(|buf| buf.push_kind(ValueKind::Null))
395
0
    }
396
397
0
    fn bool(&mut self, value: bool) -> sval::Result {
398
0
        self.try_catch(|buf| buf.push_kind(ValueKind::Bool(value)))
399
0
    }
400
401
0
    fn text_begin(&mut self, _: Option<usize>) -> sval::Result {
402
0
        self.try_catch(|buf| {
403
0
            buf.is_in_text_or_binary = true;
404
0
            buf.push_kind(ValueKind::Text(TextBuf::new()))
405
0
        })?;
406
407
0
        Ok(())
408
0
    }
409
410
0
    fn text_fragment(&mut self, fragment: &'sval str) -> sval::Result {
411
0
        self.try_catch(|buf| match buf.current_mut().kind {
412
0
            ValueKind::Text(ref mut text) => text.push_fragment(fragment),
413
0
            _ => Err(Error::outside_container("text")),
414
0
        })
415
0
    }
416
417
0
    fn text_fragment_computed(&mut self, fragment: &str) -> sval::Result {
418
0
        self.try_catch(|buf| match buf.current_mut().kind {
419
0
            ValueKind::Text(ref mut text) => text.push_fragment_computed(fragment),
420
0
            _ => Err(Error::outside_container("text")),
421
0
        })
422
0
    }
423
424
0
    fn text_end(&mut self) -> sval::Result {
425
0
        self.is_in_text_or_binary = false;
426
427
0
        Ok(())
428
0
    }
429
430
0
    fn binary_begin(&mut self, _: Option<usize>) -> sval::Result {
431
0
        self.try_catch(|buf| {
432
0
            buf.is_in_text_or_binary = true;
433
0
            buf.push_kind(ValueKind::Binary(BinaryBuf::new()))
434
0
        })
435
0
    }
436
437
0
    fn binary_fragment(&mut self, fragment: &'sval [u8]) -> sval::Result {
438
0
        self.try_catch(|buf| match buf.current_mut().kind {
439
0
            ValueKind::Binary(ref mut binary) => binary.push_fragment(fragment),
440
0
            _ => Err(Error::outside_container("binary")),
441
0
        })
442
0
    }
443
444
0
    fn binary_fragment_computed(&mut self, fragment: &[u8]) -> sval::Result {
445
0
        self.try_catch(|buf| match buf.current_mut().kind {
446
0
            ValueKind::Binary(ref mut binary) => binary.push_fragment_computed(fragment),
447
0
            _ => Err(Error::outside_container("binary")),
448
0
        })
449
0
    }
450
451
0
    fn binary_end(&mut self) -> sval::Result {
452
0
        self.is_in_text_or_binary = false;
453
454
0
        Ok(())
455
0
    }
456
457
0
    fn u8(&mut self, value: u8) -> sval::Result {
458
0
        self.try_catch(|buf| buf.push_kind(ValueKind::U8(value)))
459
0
    }
460
461
0
    fn u16(&mut self, value: u16) -> sval::Result {
462
0
        self.try_catch(|buf| buf.push_kind(ValueKind::U16(value)))
463
0
    }
464
465
0
    fn u32(&mut self, value: u32) -> sval::Result {
466
0
        self.try_catch(|buf| buf.push_kind(ValueKind::U32(value)))
467
0
    }
468
469
0
    fn u64(&mut self, value: u64) -> sval::Result {
470
0
        self.try_catch(|buf| buf.push_kind(ValueKind::U64(value)))
471
0
    }
472
473
0
    fn u128(&mut self, value: u128) -> sval::Result {
474
0
        self.try_catch(|buf| buf.push_kind(ValueKind::U128(value)))
475
0
    }
476
477
0
    fn i8(&mut self, value: i8) -> sval::Result {
478
0
        self.try_catch(|buf| buf.push_kind(ValueKind::I8(value)))
479
0
    }
480
481
0
    fn i16(&mut self, value: i16) -> sval::Result {
482
0
        self.try_catch(|buf| buf.push_kind(ValueKind::I16(value)))
483
0
    }
484
485
0
    fn i32(&mut self, value: i32) -> sval::Result {
486
0
        self.try_catch(|buf| buf.push_kind(ValueKind::I32(value)))
487
0
    }
488
489
0
    fn i64(&mut self, value: i64) -> sval::Result {
490
0
        self.try_catch(|buf| buf.push_kind(ValueKind::I64(value)))
491
0
    }
492
493
0
    fn i128(&mut self, value: i128) -> sval::Result {
494
0
        self.try_catch(|buf| buf.push_kind(ValueKind::I128(value)))
495
0
    }
496
497
0
    fn f32(&mut self, value: f32) -> sval::Result {
498
0
        self.try_catch(|buf| buf.push_kind(ValueKind::F32(value)))
499
0
    }
500
501
0
    fn f64(&mut self, value: f64) -> sval::Result {
502
0
        self.try_catch(|buf| buf.push_kind(ValueKind::F64(value)))
503
0
    }
504
505
0
    fn map_begin(&mut self, num_entries_hint: Option<usize>) -> sval::Result {
506
0
        self.try_catch(|buf| {
507
0
            buf.push_begin(ValueKind::Map {
508
0
                len: 0,
509
0
                num_entries_hint,
510
0
            })
511
0
        })
512
0
    }
513
514
0
    fn map_key_begin(&mut self) -> sval::Result {
515
0
        self.try_catch(|buf| buf.push_begin(ValueKind::MapKey { len: 0 }))
516
0
    }
517
518
0
    fn map_key_end(&mut self) -> sval::Result {
519
0
        self.try_catch(|buf| buf.push_end())
520
0
    }
521
522
0
    fn map_value_begin(&mut self) -> sval::Result {
523
0
        self.try_catch(|buf| buf.push_begin(ValueKind::MapValue { len: 0 }))
524
0
    }
525
526
0
    fn map_value_end(&mut self) -> sval::Result {
527
0
        self.try_catch(|buf| buf.push_end())
528
0
    }
529
530
0
    fn map_end(&mut self) -> sval::Result {
531
0
        self.try_catch(|buf| buf.push_end())
532
0
    }
533
534
0
    fn seq_begin(&mut self, num_entries_hint: Option<usize>) -> sval::Result {
535
0
        self.try_catch(|buf| {
536
0
            buf.push_begin(ValueKind::Seq {
537
0
                len: 0,
538
0
                num_entries_hint,
539
0
            })
540
0
        })
541
0
    }
542
543
0
    fn seq_value_begin(&mut self) -> sval::Result {
544
0
        self.try_catch(|buf| buf.push_begin(ValueKind::SeqValue { len: 0 }))
545
0
    }
546
547
0
    fn seq_value_end(&mut self) -> sval::Result {
548
0
        self.try_catch(|buf| buf.push_end())
549
0
    }
550
551
0
    fn seq_end(&mut self) -> sval::Result {
552
0
        self.try_catch(|buf| buf.push_end())
553
0
    }
554
555
0
    fn enum_begin(
556
0
        &mut self,
557
0
        tag: Option<&sval::Tag>,
558
0
        label: Option<&sval::Label>,
559
0
        index: Option<&sval::Index>,
560
0
    ) -> sval::Result {
561
0
        self.try_catch(|buf| {
562
0
            buf.push_begin(ValueKind::Enum {
563
                len: 0,
564
0
                tag: tag.cloned(),
565
0
                index: index.cloned(),
566
0
                label: label
567
0
                    .map(|label| {
568
0
                        label
569
0
                            .try_to_owned()
570
0
                            .map_err(|_| Error::no_alloc("owned label"))
571
0
                    })
572
0
                    .transpose()?,
573
            })
574
0
        })
575
0
    }
576
577
0
    fn enum_end(
578
0
        &mut self,
579
0
        _: Option<&sval::Tag>,
580
0
        _: Option<&sval::Label>,
581
0
        _: Option<&sval::Index>,
582
0
    ) -> sval::Result {
583
0
        self.try_catch(|buf| buf.push_end())
584
0
    }
585
586
0
    fn tagged_begin(
587
0
        &mut self,
588
0
        tag: Option<&sval::Tag>,
589
0
        label: Option<&sval::Label>,
590
0
        index: Option<&sval::Index>,
591
0
    ) -> sval::Result {
592
0
        self.try_catch(|buf| {
593
0
            buf.push_begin(ValueKind::Tagged {
594
                len: 0,
595
0
                tag: tag.cloned(),
596
0
                index: index.cloned(),
597
0
                label: label
598
0
                    .map(|label| {
599
0
                        label
600
0
                            .try_to_owned()
601
0
                            .map_err(|_| Error::no_alloc("owned label"))
602
0
                    })
603
0
                    .transpose()?,
604
            })
605
0
        })
606
0
    }
607
608
0
    fn tagged_end(
609
0
        &mut self,
610
0
        _: Option<&sval::Tag>,
611
0
        _: Option<&sval::Label>,
612
0
        _: Option<&sval::Index>,
613
0
    ) -> sval::Result {
614
0
        self.try_catch(|buf| buf.push_end())
615
0
    }
616
617
0
    fn tag(
618
0
        &mut self,
619
0
        tag: Option<&sval::Tag>,
620
0
        label: Option<&sval::Label>,
621
0
        index: Option<&sval::Index>,
622
0
    ) -> sval::Result {
623
0
        self.try_catch(|buf| {
624
0
            buf.push_kind(ValueKind::Tag {
625
0
                tag: tag.cloned(),
626
0
                index: index.cloned(),
627
0
                label: label
628
0
                    .map(|label| {
629
0
                        label
630
0
                            .try_to_owned()
631
0
                            .map_err(|_| Error::no_alloc("owned label"))
632
0
                    })
633
0
                    .transpose()?,
634
            })
635
0
        })
636
0
    }
637
638
0
    fn tag_hint(&mut self, tag: &sval::Tag) -> sval::Result {
639
0
        self.try_catch(|buf| buf.push_kind(ValueKind::TagHint { tag: tag.clone() }))
640
0
    }
641
642
0
    fn record_begin(
643
0
        &mut self,
644
0
        tag: Option<&sval::Tag>,
645
0
        label: Option<&sval::Label>,
646
0
        index: Option<&sval::Index>,
647
0
        num_entries: Option<usize>,
648
0
    ) -> sval::Result {
649
0
        self.try_catch(|buf| {
650
0
            buf.push_begin(ValueKind::Record {
651
                len: 0,
652
0
                tag: tag.cloned(),
653
0
                index: index.cloned(),
654
0
                label: label
655
0
                    .map(|label| {
656
0
                        label
657
0
                            .try_to_owned()
658
0
                            .map_err(|_| Error::no_alloc("owned label"))
659
0
                    })
660
0
                    .transpose()?,
661
0
                num_entries,
662
            })
663
0
        })
664
0
    }
665
666
0
    fn record_value_begin(&mut self, tag: Option<&sval::Tag>, label: &sval::Label) -> sval::Result {
667
0
        self.try_catch(|buf| {
668
0
            buf.push_begin(ValueKind::RecordValue {
669
                len: 0,
670
0
                tag: tag.cloned(),
671
0
                label: label
672
0
                    .try_to_owned()
673
0
                    .map_err(|_| Error::no_alloc("owned label"))?,
674
            })
675
0
        })
676
0
    }
677
678
0
    fn record_value_end(&mut self, _: Option<&sval::Tag>, _: &sval::Label) -> sval::Result {
679
0
        self.try_catch(|buf| buf.push_end())
680
0
    }
681
682
0
    fn record_end(
683
0
        &mut self,
684
0
        _: Option<&sval::Tag>,
685
0
        _: Option<&sval::Label>,
686
0
        _: Option<&sval::Index>,
687
0
    ) -> sval::Result {
688
0
        self.try_catch(|buf| buf.push_end())
689
0
    }
690
691
0
    fn tuple_begin(
692
0
        &mut self,
693
0
        tag: Option<&sval::Tag>,
694
0
        label: Option<&sval::Label>,
695
0
        index: Option<&sval::Index>,
696
0
        num_entries: Option<usize>,
697
0
    ) -> sval::Result {
698
0
        self.try_catch(|buf| {
699
0
            buf.push_begin(ValueKind::Tuple {
700
                len: 0,
701
0
                tag: tag.cloned(),
702
0
                index: index.cloned(),
703
0
                label: label
704
0
                    .map(|label| {
705
0
                        label
706
0
                            .try_to_owned()
707
0
                            .map_err(|_| Error::no_alloc("owned label"))
708
0
                    })
709
0
                    .transpose()?,
710
0
                num_entries,
711
            })
712
0
        })
713
0
    }
714
715
0
    fn tuple_value_begin(&mut self, tag: Option<&sval::Tag>, index: &sval::Index) -> sval::Result {
716
0
        self.try_catch(|buf| {
717
0
            buf.push_begin(ValueKind::TupleValue {
718
0
                len: 0,
719
0
                tag: tag.cloned(),
720
0
                index: index.clone(),
721
0
            })
722
0
        })
723
0
    }
724
725
0
    fn tuple_value_end(&mut self, _: Option<&sval::Tag>, _: &sval::Index) -> sval::Result {
726
0
        self.try_catch(|buf| buf.push_end())
727
0
    }
728
729
0
    fn tuple_end(
730
0
        &mut self,
731
0
        _: Option<&sval::Tag>,
732
0
        _: Option<&sval::Label>,
733
0
        _: Option<&sval::Index>,
734
0
    ) -> sval::Result {
735
0
        self.try_catch(|buf| buf.push_end())
736
0
    }
737
738
0
    fn record_tuple_begin(
739
0
        &mut self,
740
0
        tag: Option<&sval::Tag>,
741
0
        label: Option<&sval::Label>,
742
0
        index: Option<&sval::Index>,
743
0
        num_entries: Option<usize>,
744
0
    ) -> sval::Result {
745
0
        self.try_catch(|buf| {
746
0
            buf.push_begin(ValueKind::RecordTuple {
747
                len: 0,
748
0
                tag: tag.cloned(),
749
0
                index: index.cloned(),
750
0
                label: label
751
0
                    .map(|label| {
752
0
                        label
753
0
                            .try_to_owned()
754
0
                            .map_err(|_| Error::no_alloc("owned label"))
755
0
                    })
756
0
                    .transpose()?,
757
0
                num_entries,
758
            })
759
0
        })
760
0
    }
761
762
0
    fn record_tuple_value_begin(
763
0
        &mut self,
764
0
        tag: Option<&sval::Tag>,
765
0
        label: &sval::Label,
766
0
        index: &sval::Index,
767
0
    ) -> sval::Result {
768
0
        self.try_catch(|buf| {
769
0
            buf.push_begin(ValueKind::RecordTupleValue {
770
                len: 0,
771
0
                tag: tag.cloned(),
772
0
                label: label
773
0
                    .try_to_owned()
774
0
                    .map_err(|_| Error::no_alloc("owned label"))?,
775
0
                index: index.clone(),
776
            })
777
0
        })
778
0
    }
779
780
0
    fn record_tuple_value_end(
781
0
        &mut self,
782
0
        _: Option<&sval::Tag>,
783
0
        _: &sval::Label,
784
0
        _: &sval::Index,
785
0
    ) -> sval::Result {
786
0
        self.try_catch(|buf| buf.push_end())
787
0
    }
788
789
0
    fn record_tuple_end(
790
0
        &mut self,
791
0
        _: Option<&sval::Tag>,
792
0
        _: Option<&sval::Label>,
793
0
        _: Option<&sval::Index>,
794
0
    ) -> sval::Result {
795
0
        self.try_catch(|buf| buf.push_end())
796
0
    }
797
}
798
799
/**
800
Buffer a value.
801
*/
802
0
pub fn stream_to_value<'sval>(
803
0
    v: &'sval (impl sval::Value + ?Sized),
804
0
) -> Result<ValueBuf<'sval>, Error> {
805
0
    ValueBuf::collect(v)
806
0
}
807
808
/**
809
Buffer an owned value.
810
*/
811
0
pub fn stream_to_value_owned(v: impl sval::Value) -> Result<ValueBuf<'static>, Error> {
812
0
    ValueBuf::collect_owned(v)
813
0
}
814
815
#[repr(transparent)]
816
struct ValueSlice<'sval>([ValuePart<'sval>]);
817
818
#[derive(Debug, Clone, PartialEq)]
819
struct ValuePart<'sval> {
820
    kind: ValueKind<'sval>,
821
}
822
823
#[derive(Debug, Clone, PartialEq)]
824
enum ValueKind<'sval> {
825
    Null,
826
    Bool(bool),
827
    U8(u8),
828
    U16(u16),
829
    U32(u32),
830
    U64(u64),
831
    U128(u128),
832
    I8(i8),
833
    I16(i16),
834
    I32(i32),
835
    I64(i64),
836
    I128(i128),
837
    F32(f32),
838
    F64(f64),
839
    Text(TextBuf<'sval>),
840
    Binary(BinaryBuf<'sval>),
841
    Map {
842
        len: usize,
843
        num_entries_hint: Option<usize>,
844
    },
845
    MapKey {
846
        len: usize,
847
    },
848
    MapValue {
849
        len: usize,
850
    },
851
    Seq {
852
        len: usize,
853
        num_entries_hint: Option<usize>,
854
    },
855
    SeqValue {
856
        len: usize,
857
    },
858
    Tag {
859
        tag: Option<sval::Tag>,
860
        label: Option<sval::Label<'static>>,
861
        index: Option<sval::Index>,
862
    },
863
    TagHint {
864
        tag: sval::Tag,
865
    },
866
    Enum {
867
        len: usize,
868
        tag: Option<sval::Tag>,
869
        label: Option<sval::Label<'static>>,
870
        index: Option<sval::Index>,
871
    },
872
    Tagged {
873
        len: usize,
874
        tag: Option<sval::Tag>,
875
        label: Option<sval::Label<'static>>,
876
        index: Option<sval::Index>,
877
    },
878
    Record {
879
        len: usize,
880
        tag: Option<sval::Tag>,
881
        label: Option<sval::Label<'static>>,
882
        index: Option<sval::Index>,
883
        num_entries: Option<usize>,
884
    },
885
    RecordValue {
886
        len: usize,
887
        tag: Option<sval::Tag>,
888
        label: sval::Label<'static>,
889
    },
890
    Tuple {
891
        len: usize,
892
        tag: Option<sval::Tag>,
893
        label: Option<sval::Label<'static>>,
894
        index: Option<sval::Index>,
895
        num_entries: Option<usize>,
896
    },
897
    TupleValue {
898
        len: usize,
899
        tag: Option<sval::Tag>,
900
        index: sval::Index,
901
    },
902
    RecordTuple {
903
        len: usize,
904
        tag: Option<sval::Tag>,
905
        label: Option<sval::Label<'static>>,
906
        index: Option<sval::Index>,
907
        num_entries: Option<usize>,
908
    },
909
    RecordTupleValue {
910
        len: usize,
911
        tag: Option<sval::Tag>,
912
        label: sval::Label<'static>,
913
        index: sval::Index,
914
    },
915
}
916
917
impl<'sval> ValueBuf<'sval> {
918
0
    fn push_kind(&mut self, kind: ValueKind<'sval>) -> Result<(), Error> {
919
0
        self.parts.push(ValuePart { kind })
920
0
    }
921
922
0
    fn push_begin(&mut self, kind: ValueKind<'sval>) -> Result<(), Error> {
923
0
        self.stack.push(self.parts.len())?;
924
0
        self.parts.push(ValuePart { kind })
925
0
    }
926
927
0
    fn push_end(&mut self) -> Result<(), Error> {
928
0
        let index = self
929
0
            .stack
930
0
            .pop()
931
0
            .ok_or_else(|| Error::invalid_value("unbalanced calls to `begin` and `end`"))?;
932
933
0
        let len = self.parts.len() - index - 1;
934
935
0
        *match &mut self.parts.get_mut(index).unwrap().kind {
936
0
            ValueKind::Map { len, .. } => len,
937
0
            ValueKind::MapKey { len } => len,
938
0
            ValueKind::MapValue { len } => len,
939
0
            ValueKind::Seq { len, .. } => len,
940
0
            ValueKind::SeqValue { len } => len,
941
0
            ValueKind::Enum { len, .. } => len,
942
0
            ValueKind::Tagged { len, .. } => len,
943
0
            ValueKind::Record { len, .. } => len,
944
0
            ValueKind::RecordValue { len, .. } => len,
945
0
            ValueKind::Tuple { len, .. } => len,
946
0
            ValueKind::TupleValue { len, .. } => len,
947
0
            ValueKind::RecordTuple { len, .. } => len,
948
0
            ValueKind::RecordTupleValue { len, .. } => len,
949
            ValueKind::Null
950
            | ValueKind::Bool(_)
951
            | ValueKind::U8(_)
952
            | ValueKind::U16(_)
953
            | ValueKind::U32(_)
954
            | ValueKind::U64(_)
955
            | ValueKind::U128(_)
956
            | ValueKind::I8(_)
957
            | ValueKind::I16(_)
958
            | ValueKind::I32(_)
959
            | ValueKind::I64(_)
960
            | ValueKind::I128(_)
961
            | ValueKind::F32(_)
962
            | ValueKind::F64(_)
963
            | ValueKind::Text(_)
964
            | ValueKind::Binary(_)
965
            | ValueKind::Tag { .. }
966
            | ValueKind::TagHint { .. } => {
967
0
                return Err(Error::invalid_value("can't end at this index"))
968
            }
969
0
        } = len;
970
971
0
        Ok(())
972
0
    }
973
974
0
    fn current_mut(&mut self) -> &mut ValuePart<'sval> {
975
0
        self.parts.last_mut().expect("missing current")
976
0
    }
977
}
978
979
impl<'sval> ValueSlice<'sval> {
980
0
    fn new<'a>(parts: &'a [ValuePart<'sval>]) -> &'a ValueSlice<'sval> {
981
0
        unsafe { mem::transmute::<&'a [ValuePart<'sval>], &'a ValueSlice<'sval>>(parts) }
982
0
    }
983
984
0
    fn get(&self, i: usize) -> Option<&ValuePart<'sval>> {
985
0
        self.0.get(i)
986
0
    }
987
988
0
    fn slice<'a>(&'a self, range: Range<usize>) -> &'a ValueSlice<'sval> {
989
0
        match self.0.get(range.clone()) {
990
0
            Some(_) => (),
991
            None => {
992
0
                panic!("{:?} is out of range for {:?}", range, &self.0);
993
            }
994
        }
995
996
        // SAFETY: `&[ValuePart]` and `&ValueSlice` have the same ABI
997
0
        unsafe { mem::transmute::<&'a [ValuePart<'sval>], &'a ValueSlice<'sval>>(&self.0[range]) }
998
0
    }
999
}
1000
1001
#[cfg(feature = "alloc")]
1002
impl<'sval> ValuePart<'sval> {
1003
0
    fn into_owned_in_place(&mut self) -> &mut ValuePart<'static> {
1004
0
        let ValuePart { kind } = self;
1005
1006
0
        match kind {
1007
0
            ValueKind::Text(ref mut text) => crate::assert_static(text.into_owned_in_place()),
1008
0
            ValueKind::Binary(ref mut binary) => crate::assert_static(binary.into_owned_in_place()),
1009
0
            ValueKind::Null => (),
1010
0
            ValueKind::Bool(v) => crate::assert_static(v),
1011
0
            ValueKind::U8(v) => crate::assert_static(v),
1012
0
            ValueKind::U16(v) => crate::assert_static(v),
1013
0
            ValueKind::U32(v) => crate::assert_static(v),
1014
0
            ValueKind::U64(v) => crate::assert_static(v),
1015
0
            ValueKind::U128(v) => crate::assert_static(v),
1016
0
            ValueKind::I8(v) => crate::assert_static(v),
1017
0
            ValueKind::I16(v) => crate::assert_static(v),
1018
0
            ValueKind::I32(v) => crate::assert_static(v),
1019
0
            ValueKind::I64(v) => crate::assert_static(v),
1020
0
            ValueKind::I128(v) => crate::assert_static(v),
1021
0
            ValueKind::F32(v) => crate::assert_static(v),
1022
0
            ValueKind::F64(v) => crate::assert_static(v),
1023
            ValueKind::Map {
1024
0
                len,
1025
0
                num_entries_hint,
1026
            } => {
1027
0
                crate::assert_static(len);
1028
0
                crate::assert_static(num_entries_hint)
1029
            }
1030
0
            ValueKind::MapKey { len } => crate::assert_static(len),
1031
0
            ValueKind::MapValue { len } => crate::assert_static(len),
1032
            ValueKind::Seq {
1033
0
                len,
1034
0
                num_entries_hint,
1035
            } => {
1036
0
                crate::assert_static(len);
1037
0
                crate::assert_static(num_entries_hint)
1038
            }
1039
0
            ValueKind::SeqValue { len } => crate::assert_static(len),
1040
0
            ValueKind::Tag { tag, label, index } => {
1041
0
                crate::assert_static(tag);
1042
0
                crate::assert_static(label);
1043
0
                crate::assert_static(index)
1044
            }
1045
0
            ValueKind::TagHint { tag } => {
1046
0
                crate::assert_static(tag);
1047
0
            }
1048
            ValueKind::Enum {
1049
0
                len,
1050
0
                tag,
1051
0
                label,
1052
0
                index,
1053
            } => {
1054
0
                crate::assert_static(len);
1055
0
                crate::assert_static(tag);
1056
0
                crate::assert_static(label);
1057
0
                crate::assert_static(index)
1058
            }
1059
            ValueKind::Tagged {
1060
0
                len,
1061
0
                tag,
1062
0
                label,
1063
0
                index,
1064
            } => {
1065
0
                crate::assert_static(len);
1066
0
                crate::assert_static(tag);
1067
0
                crate::assert_static(label);
1068
0
                crate::assert_static(index)
1069
            }
1070
            ValueKind::Record {
1071
0
                len,
1072
0
                tag,
1073
0
                label,
1074
0
                index,
1075
0
                num_entries,
1076
            } => {
1077
0
                crate::assert_static(len);
1078
0
                crate::assert_static(tag);
1079
0
                crate::assert_static(label);
1080
0
                crate::assert_static(index);
1081
0
                crate::assert_static(num_entries)
1082
            }
1083
0
            ValueKind::RecordValue { len, tag, label } => {
1084
0
                crate::assert_static(len);
1085
0
                crate::assert_static(tag);
1086
0
                crate::assert_static(label)
1087
            }
1088
            ValueKind::Tuple {
1089
0
                len,
1090
0
                tag,
1091
0
                label,
1092
0
                index,
1093
0
                num_entries,
1094
            } => {
1095
0
                crate::assert_static(len);
1096
0
                crate::assert_static(tag);
1097
0
                crate::assert_static(label);
1098
0
                crate::assert_static(index);
1099
0
                crate::assert_static(num_entries)
1100
            }
1101
0
            ValueKind::TupleValue { len, tag, index } => {
1102
0
                crate::assert_static(len);
1103
0
                crate::assert_static(tag);
1104
0
                crate::assert_static(index)
1105
            }
1106
            ValueKind::RecordTuple {
1107
0
                len,
1108
0
                tag,
1109
0
                label,
1110
0
                index,
1111
0
                num_entries,
1112
            } => {
1113
0
                crate::assert_static(len);
1114
0
                crate::assert_static(tag);
1115
0
                crate::assert_static(label);
1116
0
                crate::assert_static(index);
1117
0
                crate::assert_static(num_entries)
1118
            }
1119
            ValueKind::RecordTupleValue {
1120
0
                len,
1121
0
                tag,
1122
0
                label,
1123
0
                index,
1124
            } => {
1125
0
                crate::assert_static(len);
1126
0
                crate::assert_static(tag);
1127
0
                crate::assert_static(label);
1128
0
                crate::assert_static(index)
1129
            }
1130
        }
1131
1132
        // SAFETY: `self` no longer contains any data borrowed for `'sval`
1133
0
        unsafe { mem::transmute::<&mut ValuePart<'sval>, &mut ValuePart<'static>>(self) }
1134
0
    }
1135
}
1136
1137
impl<'a> sval::Value for ValueSlice<'a> {
1138
0
    fn stream<'sval, S: sval::Stream<'sval> + ?Sized>(&'sval self, stream: &mut S) -> sval::Result {
1139
0
        self.stream_ref(stream)
1140
0
    }
1141
}
1142
1143
impl<'sval> sval_ref::ValueRef<'sval> for ValueSlice<'sval> {
1144
0
    fn stream_ref<'a, S: sval::Stream<'sval> + ?Sized>(&'a self, stream: &mut S) -> sval::Result {
1145
0
        let mut i = 0;
1146
1147
0
        fn stream_value<'a, 'sval, S: sval::Stream<'sval> + ?Sized>(
1148
0
            stream: &mut S,
1149
0
            i: &mut usize,
1150
0
            len: usize,
1151
0
            value: &ValueSlice<'sval>,
1152
0
            f: impl FnOnce(&mut S, &ValueSlice<'sval>) -> sval::Result,
1153
0
        ) -> sval::Result {
1154
0
            let value = value.slice({
1155
0
                let start = *i + 1;
1156
0
                let end = start + len;
1157
1158
0
                start..end
1159
            });
1160
1161
0
            f(stream, value)?;
1162
1163
0
            *i += len;
1164
1165
0
            Ok(())
1166
0
        }
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<dyn sval_dynamic::stream::Stream, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<dyn sval_dynamic::stream::Stream>::{closure#0}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<dyn sval_dynamic::stream::Stream, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<dyn sval_dynamic::stream::Stream>::{closure#2}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<dyn sval_dynamic::stream::Stream, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<dyn sval_dynamic::stream::Stream>::{closure#3}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<dyn sval_dynamic::stream::Stream, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<dyn sval_dynamic::stream::Stream>::{closure#4}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<dyn sval_dynamic::stream::Stream, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<dyn sval_dynamic::stream::Stream>::{closure#5}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<dyn sval_dynamic::stream::Stream, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<dyn sval_dynamic::stream::Stream>::{closure#6}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<dyn sval_dynamic::stream::Stream, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<dyn sval_dynamic::stream::Stream>::{closure#7}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<dyn sval_dynamic::stream::Stream, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<dyn sval_dynamic::stream::Stream>::{closure#8}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<dyn sval_dynamic::stream::Stream, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<dyn sval_dynamic::stream::Stream>::{closure#9}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<dyn sval_dynamic::stream::Stream, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<dyn sval_dynamic::stream::Stream>::{closure#10}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<dyn sval_dynamic::stream::Stream, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<dyn sval_dynamic::stream::Stream>::{closure#11}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<dyn sval_dynamic::stream::Stream, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<dyn sval_dynamic::stream::Stream>::{closure#1}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<dyn sval_dynamic::stream::Stream, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<dyn sval_dynamic::stream::Stream>::{closure#12}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::tag::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::tag::Extract>::{closure#0}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::tag::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::tag::Extract>::{closure#2}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::tag::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::tag::Extract>::{closure#3}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::tag::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::tag::Extract>::{closure#4}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::tag::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::tag::Extract>::{closure#5}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::tag::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::tag::Extract>::{closure#6}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::tag::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::tag::Extract>::{closure#7}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::tag::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::tag::Extract>::{closure#8}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::tag::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::tag::Extract>::{closure#9}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::tag::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::tag::Extract>::{closure#10}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::tag::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::tag::Extract>::{closure#11}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::tag::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::tag::Extract>::{closure#1}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::tag::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::tag::Extract>::{closure#12}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::to_f32::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::to_f32::Extract>::{closure#0}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::to_f32::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::to_f32::Extract>::{closure#2}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::to_f32::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::to_f32::Extract>::{closure#3}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::to_f32::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::to_f32::Extract>::{closure#4}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::to_f32::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::to_f32::Extract>::{closure#5}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::to_f32::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::to_f32::Extract>::{closure#6}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::to_f32::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::to_f32::Extract>::{closure#7}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::to_f32::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::to_f32::Extract>::{closure#8}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::to_f32::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::to_f32::Extract>::{closure#9}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::to_f32::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::to_f32::Extract>::{closure#10}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::to_f32::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::to_f32::Extract>::{closure#11}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::to_f32::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::to_f32::Extract>::{closure#1}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::to_f32::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::to_f32::Extract>::{closure#12}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::to_f64::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::to_f64::Extract>::{closure#0}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::to_f64::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::to_f64::Extract>::{closure#2}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::to_f64::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::to_f64::Extract>::{closure#3}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::to_f64::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::to_f64::Extract>::{closure#4}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::to_f64::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::to_f64::Extract>::{closure#5}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::to_f64::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::to_f64::Extract>::{closure#6}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::to_f64::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::to_f64::Extract>::{closure#7}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::to_f64::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::to_f64::Extract>::{closure#8}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::to_f64::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::to_f64::Extract>::{closure#9}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::to_f64::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::to_f64::Extract>::{closure#10}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::to_f64::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::to_f64::Extract>::{closure#11}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::to_f64::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::to_f64::Extract>::{closure#1}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::to_f64::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::to_f64::Extract>::{closure#12}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::to_bool::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::to_bool::Extract>::{closure#0}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::to_bool::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::to_bool::Extract>::{closure#2}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::to_bool::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::to_bool::Extract>::{closure#3}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::to_bool::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::to_bool::Extract>::{closure#4}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::to_bool::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::to_bool::Extract>::{closure#5}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::to_bool::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::to_bool::Extract>::{closure#6}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::to_bool::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::to_bool::Extract>::{closure#7}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::to_bool::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::to_bool::Extract>::{closure#8}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::to_bool::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::to_bool::Extract>::{closure#9}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::to_bool::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::to_bool::Extract>::{closure#10}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::to_bool::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::to_bool::Extract>::{closure#11}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::to_bool::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::to_bool::Extract>::{closure#1}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::to_bool::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::to_bool::Extract>::{closure#12}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::to_i128::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::to_i128::Extract>::{closure#0}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::to_i128::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::to_i128::Extract>::{closure#2}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::to_i128::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::to_i128::Extract>::{closure#3}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::to_i128::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::to_i128::Extract>::{closure#4}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::to_i128::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::to_i128::Extract>::{closure#5}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::to_i128::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::to_i128::Extract>::{closure#6}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::to_i128::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::to_i128::Extract>::{closure#7}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::to_i128::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::to_i128::Extract>::{closure#8}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::to_i128::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::to_i128::Extract>::{closure#9}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::to_i128::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::to_i128::Extract>::{closure#10}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::to_i128::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::to_i128::Extract>::{closure#11}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::to_i128::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::to_i128::Extract>::{closure#1}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::to_i128::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::to_i128::Extract>::{closure#12}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::to_text::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::to_text::Extract>::{closure#0}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::to_text::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::to_text::Extract>::{closure#2}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::to_text::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::to_text::Extract>::{closure#3}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::to_text::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::to_text::Extract>::{closure#4}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::to_text::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::to_text::Extract>::{closure#5}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::to_text::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::to_text::Extract>::{closure#6}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::to_text::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::to_text::Extract>::{closure#7}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::to_text::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::to_text::Extract>::{closure#8}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::to_text::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::to_text::Extract>::{closure#9}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::to_text::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::to_text::Extract>::{closure#10}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::to_text::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::to_text::Extract>::{closure#11}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::to_text::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::to_text::Extract>::{closure#1}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::to_text::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::to_text::Extract>::{closure#12}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::to_u128::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::to_u128::Extract>::{closure#0}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::to_u128::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::to_u128::Extract>::{closure#2}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::to_u128::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::to_u128::Extract>::{closure#3}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::to_u128::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::to_u128::Extract>::{closure#4}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::to_u128::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::to_u128::Extract>::{closure#5}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::to_u128::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::to_u128::Extract>::{closure#6}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::to_u128::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::to_u128::Extract>::{closure#7}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::to_u128::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::to_u128::Extract>::{closure#8}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::to_u128::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::to_u128::Extract>::{closure#9}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::to_u128::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::to_u128::Extract>::{closure#10}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::to_u128::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::to_u128::Extract>::{closure#11}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::to_u128::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::to_u128::Extract>::{closure#1}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::to_u128::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::to_u128::Extract>::{closure#12}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::to_binary::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::to_binary::Extract>::{closure#0}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::to_binary::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::to_binary::Extract>::{closure#2}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::to_binary::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::to_binary::Extract>::{closure#3}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::to_binary::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::to_binary::Extract>::{closure#4}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::to_binary::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::to_binary::Extract>::{closure#5}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::to_binary::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::to_binary::Extract>::{closure#6}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::to_binary::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::to_binary::Extract>::{closure#7}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::to_binary::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::to_binary::Extract>::{closure#8}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::to_binary::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::to_binary::Extract>::{closure#9}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::to_binary::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::to_binary::Extract>::{closure#10}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::to_binary::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::to_binary::Extract>::{closure#11}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::to_binary::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::to_binary::Extract>::{closure#1}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<sval::value::default_value::to_binary::Extract, <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref<sval::value::default_value::to_binary::Extract>::{closure#12}>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::stream_value::<_, _>
1167
1168
0
        while let Some(part) = self.get(i) {
1169
0
            let part: &ValuePart<'sval> = part;
1170
0
            match &part.kind {
1171
0
                ValueKind::Null => stream.null()?,
1172
0
                ValueKind::Bool(v) => stream.bool(*v)?,
1173
0
                ValueKind::U8(v) => stream.u8(*v)?,
1174
0
                ValueKind::U16(v) => stream.u16(*v)?,
1175
0
                ValueKind::U32(v) => stream.u32(*v)?,
1176
0
                ValueKind::U64(v) => stream.u64(*v)?,
1177
0
                ValueKind::U128(v) => stream.u128(*v)?,
1178
0
                ValueKind::I8(v) => stream.i8(*v)?,
1179
0
                ValueKind::I16(v) => stream.i16(*v)?,
1180
0
                ValueKind::I32(v) => stream.i32(*v)?,
1181
0
                ValueKind::I64(v) => stream.i64(*v)?,
1182
0
                ValueKind::I128(v) => stream.i128(*v)?,
1183
0
                ValueKind::F32(v) => stream.f32(*v)?,
1184
0
                ValueKind::F64(v) => stream.f64(*v)?,
1185
0
                ValueKind::Text(v) => sval_ref::stream_ref(stream, v)?,
1186
0
                ValueKind::Binary(v) => sval_ref::stream_ref(stream, v)?,
1187
                ValueKind::Map {
1188
0
                    len,
1189
0
                    num_entries_hint,
1190
                } => {
1191
0
                    stream_value(stream, &mut i, *len, self, |stream, body| {
1192
0
                        stream.map_begin(*num_entries_hint)?;
1193
0
                        sval_ref::stream_ref(stream, body)?;
1194
0
                        stream.map_end()
1195
0
                    })?;
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<dyn sval_dynamic::stream::Stream>::{closure#0}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::tag::Extract>::{closure#0}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_f32::Extract>::{closure#0}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_f64::Extract>::{closure#0}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_bool::Extract>::{closure#0}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_i128::Extract>::{closure#0}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_text::Extract>::{closure#0}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_u128::Extract>::{closure#0}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_binary::Extract>::{closure#0}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<_>::{closure#0}
1196
                }
1197
0
                ValueKind::MapKey { len } => {
1198
0
                    stream_value(stream, &mut i, *len, self, |stream, body| {
1199
0
                        stream.map_key_begin()?;
1200
0
                        sval_ref::stream_ref(stream, body)?;
1201
0
                        stream.map_key_end()
1202
0
                    })?;
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<dyn sval_dynamic::stream::Stream>::{closure#1}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::tag::Extract>::{closure#1}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_f32::Extract>::{closure#1}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_f64::Extract>::{closure#1}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_bool::Extract>::{closure#1}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_i128::Extract>::{closure#1}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_text::Extract>::{closure#1}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_u128::Extract>::{closure#1}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_binary::Extract>::{closure#1}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<_>::{closure#1}
1203
                }
1204
0
                ValueKind::MapValue { len } => {
1205
0
                    stream_value(stream, &mut i, *len, self, |stream, body| {
1206
0
                        stream.map_value_begin()?;
1207
0
                        sval_ref::stream_ref(stream, body)?;
1208
0
                        stream.map_value_end()
1209
0
                    })?;
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<dyn sval_dynamic::stream::Stream>::{closure#2}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::tag::Extract>::{closure#2}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_f32::Extract>::{closure#2}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_f64::Extract>::{closure#2}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_bool::Extract>::{closure#2}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_i128::Extract>::{closure#2}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_text::Extract>::{closure#2}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_u128::Extract>::{closure#2}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_binary::Extract>::{closure#2}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<_>::{closure#2}
1210
                }
1211
                ValueKind::Seq {
1212
0
                    len,
1213
0
                    num_entries_hint,
1214
                } => {
1215
0
                    stream_value(stream, &mut i, *len, self, |stream, body| {
1216
0
                        stream.seq_begin(*num_entries_hint)?;
1217
0
                        sval_ref::stream_ref(stream, body)?;
1218
0
                        stream.seq_end()
1219
0
                    })?;
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<dyn sval_dynamic::stream::Stream>::{closure#3}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::tag::Extract>::{closure#3}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_f32::Extract>::{closure#3}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_f64::Extract>::{closure#3}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_bool::Extract>::{closure#3}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_i128::Extract>::{closure#3}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_text::Extract>::{closure#3}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_u128::Extract>::{closure#3}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_binary::Extract>::{closure#3}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<_>::{closure#3}
1220
                }
1221
0
                ValueKind::SeqValue { len } => {
1222
0
                    stream_value(stream, &mut i, *len, self, |stream, body| {
1223
0
                        stream.seq_value_begin()?;
1224
0
                        sval_ref::stream_ref(stream, body)?;
1225
0
                        stream.seq_value_end()
1226
0
                    })?;
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<dyn sval_dynamic::stream::Stream>::{closure#4}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::tag::Extract>::{closure#4}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_f32::Extract>::{closure#4}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_f64::Extract>::{closure#4}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_bool::Extract>::{closure#4}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_i128::Extract>::{closure#4}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_text::Extract>::{closure#4}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_u128::Extract>::{closure#4}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_binary::Extract>::{closure#4}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<_>::{closure#4}
1227
                }
1228
0
                ValueKind::Tag { tag, label, index } => {
1229
0
                    stream.tag(tag.as_ref(), label.as_ref(), index.as_ref())?;
1230
                }
1231
0
                ValueKind::TagHint { tag } => {
1232
0
                    stream.tag_hint(tag)?;
1233
                }
1234
                ValueKind::Enum {
1235
0
                    len,
1236
0
                    tag,
1237
0
                    label,
1238
0
                    index,
1239
                } => {
1240
0
                    stream_value(stream, &mut i, *len, self, |stream, body| {
1241
0
                        stream.enum_begin(tag.as_ref(), label.as_ref(), index.as_ref())?;
1242
0
                        sval_ref::stream_ref(stream, body)?;
1243
0
                        stream.enum_end(tag.as_ref(), label.as_ref(), index.as_ref())
1244
0
                    })?;
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<dyn sval_dynamic::stream::Stream>::{closure#5}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::tag::Extract>::{closure#5}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_f32::Extract>::{closure#5}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_f64::Extract>::{closure#5}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_bool::Extract>::{closure#5}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_i128::Extract>::{closure#5}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_text::Extract>::{closure#5}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_u128::Extract>::{closure#5}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_binary::Extract>::{closure#5}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<_>::{closure#5}
1245
                }
1246
                ValueKind::Tagged {
1247
0
                    len,
1248
0
                    tag,
1249
0
                    label,
1250
0
                    index,
1251
                } => {
1252
0
                    stream_value(stream, &mut i, *len, self, |stream, body| {
1253
0
                        stream.tagged_begin(tag.as_ref(), label.as_ref(), index.as_ref())?;
1254
0
                        sval_ref::stream_ref(stream, body)?;
1255
0
                        stream.tagged_end(tag.as_ref(), label.as_ref(), index.as_ref())
1256
0
                    })?;
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<dyn sval_dynamic::stream::Stream>::{closure#6}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::tag::Extract>::{closure#6}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_f32::Extract>::{closure#6}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_f64::Extract>::{closure#6}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_bool::Extract>::{closure#6}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_i128::Extract>::{closure#6}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_text::Extract>::{closure#6}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_u128::Extract>::{closure#6}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_binary::Extract>::{closure#6}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<_>::{closure#6}
1257
                }
1258
                ValueKind::Record {
1259
0
                    len,
1260
0
                    tag,
1261
0
                    label,
1262
0
                    index,
1263
0
                    num_entries,
1264
                } => {
1265
0
                    stream_value(stream, &mut i, *len, self, |stream, body| {
1266
0
                        stream.record_begin(
1267
0
                            tag.as_ref(),
1268
0
                            label.as_ref(),
1269
0
                            index.as_ref(),
1270
0
                            *num_entries,
1271
0
                        )?;
1272
0
                        sval_ref::stream_ref(stream, body)?;
1273
0
                        stream.record_end(tag.as_ref(), label.as_ref(), index.as_ref())
1274
0
                    })?;
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<dyn sval_dynamic::stream::Stream>::{closure#7}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::tag::Extract>::{closure#7}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_f32::Extract>::{closure#7}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_f64::Extract>::{closure#7}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_bool::Extract>::{closure#7}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_i128::Extract>::{closure#7}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_text::Extract>::{closure#7}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_u128::Extract>::{closure#7}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_binary::Extract>::{closure#7}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<_>::{closure#7}
1275
                }
1276
0
                ValueKind::RecordValue { len, tag, label } => {
1277
0
                    stream_value(stream, &mut i, *len, self, |stream, body| {
1278
0
                        stream.record_value_begin(tag.as_ref(), label)?;
1279
0
                        sval_ref::stream_ref(stream, body)?;
1280
0
                        stream.record_value_end(tag.as_ref(), label)
1281
0
                    })?;
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<dyn sval_dynamic::stream::Stream>::{closure#8}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::tag::Extract>::{closure#8}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_f32::Extract>::{closure#8}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_f64::Extract>::{closure#8}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_bool::Extract>::{closure#8}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_i128::Extract>::{closure#8}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_text::Extract>::{closure#8}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_u128::Extract>::{closure#8}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_binary::Extract>::{closure#8}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<_>::{closure#8}
1282
                }
1283
                ValueKind::Tuple {
1284
0
                    len,
1285
0
                    tag,
1286
0
                    label,
1287
0
                    index,
1288
0
                    num_entries,
1289
                } => {
1290
0
                    stream_value(stream, &mut i, *len, self, |stream, body| {
1291
0
                        stream.tuple_begin(
1292
0
                            tag.as_ref(),
1293
0
                            label.as_ref(),
1294
0
                            index.as_ref(),
1295
0
                            *num_entries,
1296
0
                        )?;
1297
0
                        sval_ref::stream_ref(stream, body)?;
1298
0
                        stream.tuple_end(tag.as_ref(), label.as_ref(), index.as_ref())
1299
0
                    })?;
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<dyn sval_dynamic::stream::Stream>::{closure#9}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::tag::Extract>::{closure#9}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_f32::Extract>::{closure#9}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_f64::Extract>::{closure#9}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_bool::Extract>::{closure#9}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_i128::Extract>::{closure#9}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_text::Extract>::{closure#9}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_u128::Extract>::{closure#9}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_binary::Extract>::{closure#9}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<_>::{closure#9}
1300
                }
1301
0
                ValueKind::TupleValue { len, tag, index } => {
1302
0
                    stream_value(stream, &mut i, *len, self, |stream, body| {
1303
0
                        stream.tuple_value_begin(tag.as_ref(), index)?;
1304
0
                        sval_ref::stream_ref(stream, body)?;
1305
0
                        stream.tuple_value_end(tag.as_ref(), index)
1306
0
                    })?;
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<dyn sval_dynamic::stream::Stream>::{closure#10}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::tag::Extract>::{closure#10}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_f32::Extract>::{closure#10}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_f64::Extract>::{closure#10}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_bool::Extract>::{closure#10}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_i128::Extract>::{closure#10}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_text::Extract>::{closure#10}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_u128::Extract>::{closure#10}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_binary::Extract>::{closure#10}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<_>::{closure#10}
1307
                }
1308
                ValueKind::RecordTuple {
1309
0
                    len,
1310
0
                    tag,
1311
0
                    label,
1312
0
                    index,
1313
0
                    num_entries,
1314
                } => {
1315
0
                    stream_value(stream, &mut i, *len, self, |stream, body| {
1316
0
                        stream.record_tuple_begin(
1317
0
                            tag.as_ref(),
1318
0
                            label.as_ref(),
1319
0
                            index.as_ref(),
1320
0
                            *num_entries,
1321
0
                        )?;
1322
0
                        sval_ref::stream_ref(stream, body)?;
1323
0
                        stream.record_tuple_end(tag.as_ref(), label.as_ref(), index.as_ref())
1324
0
                    })?;
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<dyn sval_dynamic::stream::Stream>::{closure#11}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::tag::Extract>::{closure#11}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_f32::Extract>::{closure#11}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_f64::Extract>::{closure#11}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_bool::Extract>::{closure#11}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_i128::Extract>::{closure#11}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_text::Extract>::{closure#11}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_u128::Extract>::{closure#11}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_binary::Extract>::{closure#11}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<_>::{closure#11}
1325
                }
1326
                ValueKind::RecordTupleValue {
1327
0
                    len,
1328
0
                    tag,
1329
0
                    label,
1330
0
                    index,
1331
                } => {
1332
0
                    stream_value(stream, &mut i, *len, self, |stream, body| {
1333
0
                        stream.record_tuple_value_begin(tag.as_ref(), label, index)?;
1334
0
                        sval_ref::stream_ref(stream, body)?;
1335
0
                        stream.record_tuple_value_end(tag.as_ref(), label, index)
1336
0
                    })?;
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<dyn sval_dynamic::stream::Stream>::{closure#12}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::tag::Extract>::{closure#12}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_f32::Extract>::{closure#12}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_f64::Extract>::{closure#12}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_bool::Extract>::{closure#12}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_i128::Extract>::{closure#12}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_text::Extract>::{closure#12}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_u128::Extract>::{closure#12}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_binary::Extract>::{closure#12}
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<_>::{closure#12}
1337
                }
1338
            }
1339
1340
0
            i += 1;
1341
        }
1342
1343
0
        Ok(())
1344
0
    }
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<dyn sval_dynamic::stream::Stream>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::tag::Extract>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_f32::Extract>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_f64::Extract>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_bool::Extract>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_i128::Extract>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_text::Extract>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_u128::Extract>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<sval::value::default_value::to_binary::Extract>
Unexecuted instantiation: <sval_buffer::value::ValueSlice as sval_ref::ValueRef>::stream_ref::<_>
1345
}
1346
1347
#[cfg(not(feature = "alloc"))]
1348
mod array_vec {
1349
    use crate::{
1350
        std::{
1351
            fmt, mem,
1352
            ops::{Deref, DerefMut},
1353
        },
1354
        Error,
1355
    };
1356
1357
    pub(super) struct ArrayVec<T, const N: usize> {
1358
        buf: [mem::MaybeUninit<T>; N],
1359
        len: usize,
1360
    }
1361
1362
    impl<T: Clone, const N: usize> Clone for ArrayVec<T, N> {
1363
        fn clone(&self) -> Self {
1364
            let mut buf = Self::default();
1365
1366
            for value in self.iter().cloned() {
1367
                buf.push(value).unwrap();
1368
            }
1369
1370
            buf
1371
        }
1372
    }
1373
1374
    impl<T, const N: usize> Default for ArrayVec<T, N> {
1375
        fn default() -> Self {
1376
            ArrayVec {
1377
                // SAFETY: An array of uninitialized values is valid
1378
                buf: unsafe {
1379
                    mem::MaybeUninit::<[mem::MaybeUninit<T>; N]>::uninit().assume_init()
1380
                },
1381
                len: 0,
1382
            }
1383
        }
1384
    }
1385
1386
    impl<T, const N: usize> Drop for ArrayVec<T, N> {
1387
        fn drop(&mut self) {
1388
            // SAFETY: Values up to `self.len` are initialized
1389
            unsafe {
1390
                crate::std::ptr::drop_in_place::<[T]>(&mut **self as *mut [T]);
1391
            }
1392
        }
1393
    }
1394
1395
    impl<T: fmt::Debug, const N: usize> fmt::Debug for ArrayVec<T, N> {
1396
        fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1397
            fmt::Debug::fmt(&**self, f)
1398
        }
1399
    }
1400
1401
    impl<T, const N: usize> Deref for ArrayVec<T, N> {
1402
        type Target = [T];
1403
1404
        fn deref(&self) -> &Self::Target {
1405
            let buf = &self.buf[..self.len];
1406
1407
            // SAFETY: Values up to `self.len` are initialized
1408
            unsafe { &*(buf as *const [mem::MaybeUninit<T>] as *const [T]) }
1409
        }
1410
    }
1411
1412
    impl<T, const N: usize> DerefMut for ArrayVec<T, N> {
1413
        fn deref_mut(&mut self) -> &mut Self::Target {
1414
            let buf = &mut self.buf[..self.len];
1415
1416
            // SAFETY: Values up to `self.len` are initialized
1417
            unsafe { &mut *(buf as *mut [mem::MaybeUninit<T>] as *mut [T]) }
1418
        }
1419
    }
1420
1421
    impl<T, const N: usize> ArrayVec<T, N> {
1422
        pub(super) fn push(&mut self, value: T) -> Result<(), Error> {
1423
            if self.len == N {
1424
                return Err(Error::no_alloc("vec push"));
1425
            }
1426
1427
            mem::MaybeUninit::write(&mut self.buf[self.len], value);
1428
            self.len += 1;
1429
1430
            Ok(())
1431
        }
1432
1433
        pub(super) fn pop(&mut self) -> Option<T> {
1434
            match self.len.checked_sub(1) {
1435
                Some(i) => {
1436
                    self.len = i;
1437
1438
                    // SAFETY: The value at `i` is initialized and being moved out of
1439
                    Some(unsafe { mem::MaybeUninit::assume_init_read(&self.buf[i]) })
1440
                }
1441
                None => None,
1442
            }
1443
        }
1444
1445
        pub(super) fn clear(&mut self) {
1446
            *self = Default::default()
1447
        }
1448
    }
1449
1450
    #[cfg(test)]
1451
    mod tests {
1452
        use super::*;
1453
1454
        use alloc::rc::Rc;
1455
1456
        #[test]
1457
        fn push_pop() {
1458
            let mut vec = ArrayVec::<_, 2>::default();
1459
1460
            assert!(vec.pop().is_none());
1461
1462
            assert!(vec.push(1).is_ok());
1463
            assert!(vec.push(2).is_ok());
1464
            assert!(vec.push(3).is_err());
1465
1466
            assert_eq!(2, vec.pop().unwrap());
1467
            assert_eq!(1, vec.pop().unwrap());
1468
            assert!(vec.pop().is_none());
1469
1470
            assert!(vec.push(1).is_ok());
1471
1472
            assert_eq!(1, vec.pop().unwrap());
1473
            assert!(vec.pop().is_none());
1474
        }
1475
1476
        #[test]
1477
        fn destructors() {
1478
            let mut vec = ArrayVec::<_, 5>::default();
1479
1480
            let a = Rc::new(1);
1481
            let b = Rc::new(2);
1482
1483
            vec.push(a.clone()).unwrap();
1484
            vec.push(b.clone()).unwrap();
1485
1486
            assert_eq!(2, Rc::strong_count(&a));
1487
            assert_eq!(2, Rc::strong_count(&b));
1488
1489
            drop(vec);
1490
1491
            assert_eq!(1, Rc::strong_count(&a));
1492
            assert_eq!(1, Rc::strong_count(&b));
1493
        }
1494
    }
1495
}
1496
1497
#[cfg(test)]
1498
mod tests {
1499
    use super::*;
1500
1501
    use sval::Stream as _;
1502
1503
    #[test]
1504
    fn is_send_sync() {
1505
        fn assert<T: Send + Sync>() {}
1506
1507
        assert::<ValueBuf>();
1508
        assert::<Value>();
1509
    }
1510
1511
    #[test]
1512
    fn empty_is_complete() {
1513
        assert!(!ValueBuf::new().is_complete());
1514
    }
1515
1516
    #[test]
1517
    fn primitive_is_complete() {
1518
        assert!(ValueBuf::collect(&42).unwrap().is_complete());
1519
    }
1520
1521
    #[test]
1522
    fn text_is_complete() {
1523
        let mut buf = ValueBuf::new();
1524
1525
        buf.text_begin(None).unwrap();
1526
1527
        assert!(!buf.is_complete());
1528
1529
        buf.text_end().unwrap();
1530
1531
        assert!(buf.is_complete());
1532
    }
1533
1534
    #[test]
1535
    fn binary_is_complete() {
1536
        let mut buf = ValueBuf::new();
1537
1538
        buf.binary_begin(None).unwrap();
1539
1540
        assert!(!buf.is_complete());
1541
1542
        buf.binary_end().unwrap();
1543
1544
        assert!(buf.is_complete());
1545
    }
1546
1547
    #[test]
1548
    fn map_is_complete() {
1549
        let mut buf = ValueBuf::new();
1550
1551
        buf.map_begin(None).unwrap();
1552
1553
        assert!(!buf.is_complete());
1554
1555
        buf.map_end().unwrap();
1556
1557
        assert!(buf.is_complete());
1558
    }
1559
1560
    #[test]
1561
    fn seq_is_complete() {
1562
        let mut buf = ValueBuf::new();
1563
1564
        buf.seq_begin(None).unwrap();
1565
1566
        assert!(!buf.is_complete());
1567
1568
        buf.seq_end().unwrap();
1569
1570
        assert!(buf.is_complete());
1571
    }
1572
1573
    #[test]
1574
    fn empty() {
1575
        use sval_test::{assert_tokens, Token::*};
1576
1577
        assert_tokens(&ValueBuf::new(), &[Null]);
1578
    }
1579
1580
    #[test]
1581
    fn buffer_primitive() {
1582
        for (value, expected) in [
1583
            (
1584
                ValueBuf::collect(&true).unwrap(),
1585
                vec![ValuePart {
1586
                    kind: ValueKind::Bool(true),
1587
                }],
1588
            ),
1589
            (
1590
                ValueBuf::collect(&1i8).unwrap(),
1591
                vec![ValuePart {
1592
                    kind: ValueKind::I8(1),
1593
                }],
1594
            ),
1595
            (
1596
                ValueBuf::collect(&2i16).unwrap(),
1597
                vec![ValuePart {
1598
                    kind: ValueKind::I16(2),
1599
                }],
1600
            ),
1601
            (
1602
                ValueBuf::collect(&3i32).unwrap(),
1603
                vec![ValuePart {
1604
                    kind: ValueKind::I32(3),
1605
                }],
1606
            ),
1607
            (
1608
                ValueBuf::collect(&4i64).unwrap(),
1609
                vec![ValuePart {
1610
                    kind: ValueKind::I64(4),
1611
                }],
1612
            ),
1613
            (
1614
                ValueBuf::collect(&5i128).unwrap(),
1615
                vec![ValuePart {
1616
                    kind: ValueKind::I128(5),
1617
                }],
1618
            ),
1619
            (
1620
                ValueBuf::collect(&1u8).unwrap(),
1621
                vec![ValuePart {
1622
                    kind: ValueKind::U8(1),
1623
                }],
1624
            ),
1625
            (
1626
                ValueBuf::collect(&2u16).unwrap(),
1627
                vec![ValuePart {
1628
                    kind: ValueKind::U16(2),
1629
                }],
1630
            ),
1631
            (
1632
                ValueBuf::collect(&3u32).unwrap(),
1633
                vec![ValuePart {
1634
                    kind: ValueKind::U32(3),
1635
                }],
1636
            ),
1637
            (
1638
                ValueBuf::collect(&4u64).unwrap(),
1639
                vec![ValuePart {
1640
                    kind: ValueKind::U64(4),
1641
                }],
1642
            ),
1643
            (
1644
                ValueBuf::collect(&5u128).unwrap(),
1645
                vec![ValuePart {
1646
                    kind: ValueKind::U128(5),
1647
                }],
1648
            ),
1649
            (
1650
                ValueBuf::collect(&3.14f32).unwrap(),
1651
                vec![ValuePart {
1652
                    kind: ValueKind::F32(3.14),
1653
                }],
1654
            ),
1655
            (
1656
                ValueBuf::collect(&3.1415f64).unwrap(),
1657
                vec![ValuePart {
1658
                    kind: ValueKind::F64(3.1415),
1659
                }],
1660
            ),
1661
            (
1662
                ValueBuf::collect("abc").unwrap(),
1663
                vec![ValuePart {
1664
                    kind: ValueKind::Text(TextBuf::from("abc")),
1665
                }],
1666
            ),
1667
            (
1668
                ValueBuf::collect(sval::BinarySlice::new(b"abc")).unwrap(),
1669
                vec![ValuePart {
1670
                    kind: ValueKind::Binary(BinaryBuf::from(b"abc")),
1671
                }],
1672
            ),
1673
            (
1674
                ValueBuf::collect(sval::MapSlice::<&str, i32>::new(&[])).unwrap(),
1675
                vec![ValuePart {
1676
                    kind: ValueKind::Map {
1677
                        len: 0,
1678
                        num_entries_hint: Some(0),
1679
                    },
1680
                }],
1681
            ),
1682
            (
1683
                ValueBuf::collect(&[] as &[i32]).unwrap(),
1684
                vec![ValuePart {
1685
                    kind: ValueKind::Seq {
1686
                        len: 0,
1687
                        num_entries_hint: Some(0),
1688
                    },
1689
                }],
1690
            ),
1691
        ] {
1692
            assert_eq!(expected, &*value.parts, "{:?}", value);
1693
        }
1694
    }
1695
1696
    #[test]
1697
    fn buffer_empty_enum() {
1698
        let mut buf = ValueBuf::new();
1699
1700
        buf.enum_begin(None, Some(&sval::Label::new("Enum")), None)
1701
            .unwrap();
1702
        buf.enum_end(None, Some(&sval::Label::new("Enum")), None)
1703
            .unwrap();
1704
1705
        assert_eq!(
1706
            &[ValuePart {
1707
                kind: ValueKind::Enum {
1708
                    len: 0,
1709
                    tag: None,
1710
                    label: Some(sval::Label::new("Enum")),
1711
                    index: None
1712
                }
1713
            }],
1714
            &*buf.parts
1715
        );
1716
    }
1717
1718
    #[test]
1719
    fn buffer_empty_record() {
1720
        let mut buf = ValueBuf::new();
1721
1722
        buf.record_begin(None, Some(&sval::Label::new("Record")), None, Some(0))
1723
            .unwrap();
1724
        buf.record_end(None, Some(&sval::Label::new("Record")), None)
1725
            .unwrap();
1726
1727
        assert_eq!(
1728
            &[ValuePart {
1729
                kind: ValueKind::Record {
1730
                    len: 0,
1731
                    tag: None,
1732
                    label: Some(sval::Label::new("Record")),
1733
                    index: None,
1734
                    num_entries: Some(0)
1735
                }
1736
            }],
1737
            &*buf.parts
1738
        );
1739
    }
1740
1741
    #[test]
1742
    fn buffer_empty_tuple() {
1743
        let mut buf = ValueBuf::new();
1744
1745
        buf.tuple_begin(None, Some(&sval::Label::new("Tuple")), None, Some(0))
1746
            .unwrap();
1747
        buf.tuple_end(None, Some(&sval::Label::new("Tuple")), None)
1748
            .unwrap();
1749
1750
        assert_eq!(
1751
            &[ValuePart {
1752
                kind: ValueKind::Tuple {
1753
                    len: 0,
1754
                    tag: None,
1755
                    label: Some(sval::Label::new("Tuple")),
1756
                    index: None,
1757
                    num_entries: Some(0)
1758
                }
1759
            }],
1760
            &*buf.parts
1761
        );
1762
    }
1763
1764
    #[test]
1765
    fn buffer_reuse() {
1766
        let mut buf = ValueBuf::new();
1767
1768
        buf.i32(42).unwrap();
1769
1770
        assert_eq!(
1771
            &*Value::collect(&42i32).unwrap().parts,
1772
            &*buf.to_value().parts
1773
        );
1774
1775
        buf.clear();
1776
1777
        buf.bool(true).unwrap();
1778
1779
        assert_eq!(
1780
            &*Value::collect(&true).unwrap().parts,
1781
            &*buf.to_value().parts
1782
        );
1783
    }
1784
1785
    #[test]
1786
    fn buffer_invalid() {
1787
        struct Kaboom;
1788
1789
        impl sval::Value for Kaboom {
1790
            fn stream<'sval, S: sval::Stream<'sval> + ?Sized>(
1791
                &'sval self,
1792
                _: &mut S,
1793
            ) -> sval::Result {
1794
                sval::error()
1795
            }
1796
        }
1797
1798
        // Ensure we don't panic
1799
        let _ = Value::collect(&Kaboom);
1800
        let _ = Value::collect_owned(&Kaboom);
1801
    }
1802
}
1803
1804
#[cfg(test)]
1805
#[cfg(feature = "alloc")]
1806
mod alloc_tests {
1807
    use super::*;
1808
1809
    use crate::std::string::String;
1810
1811
    use sval::Stream as _;
1812
    use sval_derive_macros::*;
1813
1814
    #[test]
1815
    fn collect_owned() {
1816
        let short_lived = String::from("abc");
1817
1818
        let buf = ValueBuf::collect_owned(&short_lived).unwrap();
1819
        drop(short_lived);
1820
1821
        match buf.parts[0].kind {
1822
            ValueKind::Text(ref text) => {
1823
                assert!(text.as_borrowed_str().is_none());
1824
                assert_eq!("abc", text.as_str());
1825
            }
1826
            _ => unreachable!(),
1827
        }
1828
    }
1829
1830
    #[test]
1831
    fn into_owned() {
1832
        let short_lived = String::from("abc");
1833
1834
        let buf = ValueBuf::collect(&short_lived).unwrap();
1835
        let borrowed_ptr = buf.parts.as_ptr() as *const ();
1836
1837
        let owned = buf.into_owned().unwrap();
1838
        let owned_ptr = owned.parts.as_ptr() as *const ();
1839
        drop(short_lived);
1840
1841
        assert!(core::ptr::eq(borrowed_ptr, owned_ptr));
1842
1843
        match owned.parts[0].kind {
1844
            ValueKind::Text(ref text) => {
1845
                assert!(text.as_borrowed_str().is_none());
1846
                assert_eq!("abc", text.as_str());
1847
            }
1848
            _ => unreachable!(),
1849
        }
1850
    }
1851
1852
    #[test]
1853
    fn buffer_option() {
1854
        let expected = vec![ValuePart {
1855
            kind: ValueKind::Tag {
1856
                tag: Some(sval::tags::RUST_OPTION_NONE),
1857
                label: Some(sval::Label::new("None")),
1858
                index: Some(sval::Index::new(0)),
1859
            },
1860
        }];
1861
1862
        assert_eq!(expected, &*ValueBuf::collect(&None::<i32>).unwrap().parts);
1863
1864
        let expected = vec![
1865
            ValuePart {
1866
                kind: ValueKind::Tagged {
1867
                    len: 1,
1868
                    tag: Some(sval::tags::RUST_OPTION_SOME),
1869
                    label: Some(sval::Label::new("Some")),
1870
                    index: Some(sval::Index::new(1)),
1871
                },
1872
            },
1873
            ValuePart {
1874
                kind: ValueKind::I32(42),
1875
            },
1876
        ];
1877
1878
        assert_eq!(expected, &*ValueBuf::collect(&Some(42i32)).unwrap().parts);
1879
    }
1880
1881
    #[test]
1882
    fn buffer_map() {
1883
        let mut value = ValueBuf::new();
1884
1885
        value.map_begin(Some(2)).unwrap();
1886
1887
        value.map_key_begin().unwrap();
1888
        value.i32(0).unwrap();
1889
        value.map_key_end().unwrap();
1890
1891
        value.map_value_begin().unwrap();
1892
        value.bool(false).unwrap();
1893
        value.map_value_end().unwrap();
1894
1895
        value.map_key_begin().unwrap();
1896
        value.i32(1).unwrap();
1897
        value.map_key_end().unwrap();
1898
1899
        value.map_value_begin().unwrap();
1900
        value.bool(true).unwrap();
1901
        value.map_value_end().unwrap();
1902
1903
        value.map_end().unwrap();
1904
1905
        let expected = vec![
1906
            ValuePart {
1907
                kind: ValueKind::Map {
1908
                    len: 8,
1909
                    num_entries_hint: Some(2),
1910
                },
1911
            },
1912
            ValuePart {
1913
                kind: ValueKind::MapKey { len: 1 },
1914
            },
1915
            ValuePart {
1916
                kind: ValueKind::I32(0),
1917
            },
1918
            ValuePart {
1919
                kind: ValueKind::MapValue { len: 1 },
1920
            },
1921
            ValuePart {
1922
                kind: ValueKind::Bool(false),
1923
            },
1924
            ValuePart {
1925
                kind: ValueKind::MapKey { len: 1 },
1926
            },
1927
            ValuePart {
1928
                kind: ValueKind::I32(1),
1929
            },
1930
            ValuePart {
1931
                kind: ValueKind::MapValue { len: 1 },
1932
            },
1933
            ValuePart {
1934
                kind: ValueKind::Bool(true),
1935
            },
1936
        ];
1937
1938
        assert_eq!(expected, &*value.parts);
1939
    }
1940
1941
    #[test]
1942
    fn buffer_seq() {
1943
        let mut value = ValueBuf::new();
1944
1945
        value.seq_begin(Some(2)).unwrap();
1946
1947
        value.seq_value_begin().unwrap();
1948
        value.bool(false).unwrap();
1949
        value.seq_value_end().unwrap();
1950
1951
        value.seq_value_begin().unwrap();
1952
        value.bool(true).unwrap();
1953
        value.seq_value_end().unwrap();
1954
1955
        value.seq_end().unwrap();
1956
1957
        let expected = vec![
1958
            ValuePart {
1959
                kind: ValueKind::Seq {
1960
                    len: 4,
1961
                    num_entries_hint: Some(2),
1962
                },
1963
            },
1964
            ValuePart {
1965
                kind: ValueKind::SeqValue { len: 1 },
1966
            },
1967
            ValuePart {
1968
                kind: ValueKind::Bool(false),
1969
            },
1970
            ValuePart {
1971
                kind: ValueKind::SeqValue { len: 1 },
1972
            },
1973
            ValuePart {
1974
                kind: ValueKind::Bool(true),
1975
            },
1976
        ];
1977
1978
        assert_eq!(expected, &*value.parts);
1979
    }
1980
1981
    #[test]
1982
    fn buffer_record() {
1983
        let mut value = ValueBuf::new();
1984
1985
        value
1986
            .record_begin(
1987
                Some(&sval::Tag::new("test")),
1988
                Some(&sval::Label::new("A")),
1989
                Some(&sval::Index::new(1)),
1990
                Some(2),
1991
            )
1992
            .unwrap();
1993
1994
        value
1995
            .record_value_begin(None, &sval::Label::new("a"))
1996
            .unwrap();
1997
        value.bool(false).unwrap();
1998
        value
1999
            .record_value_end(None, &sval::Label::new("a"))
2000
            .unwrap();
2001
2002
        value
2003
            .record_value_begin(None, &sval::Label::new("b"))
2004
            .unwrap();
2005
        value.bool(true).unwrap();
2006
        value
2007
            .record_value_end(None, &sval::Label::new("b"))
2008
            .unwrap();
2009
2010
        value
2011
            .record_end(
2012
                Some(&sval::Tag::new("test")),
2013
                Some(&sval::Label::new("A")),
2014
                Some(&sval::Index::new(1)),
2015
            )
2016
            .unwrap();
2017
2018
        let expected = vec![
2019
            ValuePart {
2020
                kind: ValueKind::Record {
2021
                    len: 4,
2022
                    tag: Some(sval::Tag::new("test")),
2023
                    label: Some(sval::Label::new("A")),
2024
                    index: Some(sval::Index::new(1)),
2025
                    num_entries: Some(2),
2026
                },
2027
            },
2028
            ValuePart {
2029
                kind: ValueKind::RecordValue {
2030
                    len: 1,
2031
                    tag: None,
2032
                    label: sval::Label::new("a"),
2033
                },
2034
            },
2035
            ValuePart {
2036
                kind: ValueKind::Bool(false),
2037
            },
2038
            ValuePart {
2039
                kind: ValueKind::RecordValue {
2040
                    len: 1,
2041
                    tag: None,
2042
                    label: sval::Label::new("b"),
2043
                },
2044
            },
2045
            ValuePart {
2046
                kind: ValueKind::Bool(true),
2047
            },
2048
        ];
2049
2050
        assert_eq!(expected, &*value.parts);
2051
    }
2052
2053
    #[test]
2054
    fn buffer_tuple() {
2055
        let mut value = ValueBuf::new();
2056
2057
        value
2058
            .tuple_begin(
2059
                Some(&sval::Tag::new("test")),
2060
                Some(&sval::Label::new("A")),
2061
                Some(&sval::Index::new(1)),
2062
                Some(2),
2063
            )
2064
            .unwrap();
2065
2066
        value.tuple_value_begin(None, &sval::Index::new(0)).unwrap();
2067
        value.bool(false).unwrap();
2068
        value.tuple_value_end(None, &sval::Index::new(0)).unwrap();
2069
2070
        value.tuple_value_begin(None, &sval::Index::new(1)).unwrap();
2071
        value.bool(true).unwrap();
2072
        value.tuple_value_end(None, &sval::Index::new(1)).unwrap();
2073
2074
        value
2075
            .tuple_end(
2076
                Some(&sval::Tag::new("test")),
2077
                Some(&sval::Label::new("A")),
2078
                Some(&sval::Index::new(1)),
2079
            )
2080
            .unwrap();
2081
2082
        let expected = vec![
2083
            ValuePart {
2084
                kind: ValueKind::Tuple {
2085
                    len: 4,
2086
                    tag: Some(sval::Tag::new("test")),
2087
                    label: Some(sval::Label::new("A")),
2088
                    index: Some(sval::Index::new(1)),
2089
                    num_entries: Some(2),
2090
                },
2091
            },
2092
            ValuePart {
2093
                kind: ValueKind::TupleValue {
2094
                    len: 1,
2095
                    tag: None,
2096
                    index: sval::Index::new(0),
2097
                },
2098
            },
2099
            ValuePart {
2100
                kind: ValueKind::Bool(false),
2101
            },
2102
            ValuePart {
2103
                kind: ValueKind::TupleValue {
2104
                    len: 1,
2105
                    tag: None,
2106
                    index: sval::Index::new(1),
2107
                },
2108
            },
2109
            ValuePart {
2110
                kind: ValueKind::Bool(true),
2111
            },
2112
        ];
2113
2114
        assert_eq!(expected, &*value.parts);
2115
    }
2116
2117
    #[test]
2118
    fn buffer_record_tuple() {
2119
        let mut value = ValueBuf::new();
2120
2121
        value
2122
            .record_tuple_begin(
2123
                Some(&sval::Tag::new("test")),
2124
                Some(&sval::Label::new("A")),
2125
                Some(&sval::Index::new(1)),
2126
                Some(2),
2127
            )
2128
            .unwrap();
2129
2130
        value
2131
            .record_tuple_value_begin(None, &sval::Label::new("a"), &sval::Index::new(0))
2132
            .unwrap();
2133
        value.bool(false).unwrap();
2134
        value
2135
            .record_tuple_value_end(None, &sval::Label::new("a"), &sval::Index::new(0))
2136
            .unwrap();
2137
2138
        value
2139
            .record_tuple_value_begin(None, &sval::Label::new("b"), &sval::Index::new(1))
2140
            .unwrap();
2141
        value.bool(true).unwrap();
2142
        value
2143
            .record_tuple_value_end(None, &sval::Label::new("b"), &sval::Index::new(1))
2144
            .unwrap();
2145
2146
        value
2147
            .record_tuple_end(
2148
                Some(&sval::Tag::new("test")),
2149
                Some(&sval::Label::new("A")),
2150
                Some(&sval::Index::new(1)),
2151
            )
2152
            .unwrap();
2153
2154
        let expected = vec![
2155
            ValuePart {
2156
                kind: ValueKind::RecordTuple {
2157
                    len: 4,
2158
                    tag: Some(sval::Tag::new("test")),
2159
                    label: Some(sval::Label::new("A")),
2160
                    index: Some(sval::Index::new(1)),
2161
                    num_entries: Some(2),
2162
                },
2163
            },
2164
            ValuePart {
2165
                kind: ValueKind::RecordTupleValue {
2166
                    len: 1,
2167
                    tag: None,
2168
                    label: sval::Label::new("a"),
2169
                    index: sval::Index::new(0),
2170
                },
2171
            },
2172
            ValuePart {
2173
                kind: ValueKind::Bool(false),
2174
            },
2175
            ValuePart {
2176
                kind: ValueKind::RecordTupleValue {
2177
                    len: 1,
2178
                    tag: None,
2179
                    label: sval::Label::new("b"),
2180
                    index: sval::Index::new(1),
2181
                },
2182
            },
2183
            ValuePart {
2184
                kind: ValueKind::Bool(true),
2185
            },
2186
        ];
2187
2188
        assert_eq!(expected, &*value.parts);
2189
    }
2190
2191
    #[test]
2192
    fn buffer_enum() {
2193
        let mut value = ValueBuf::new();
2194
2195
        value
2196
            .enum_begin(
2197
                Some(&sval::Tag::new("test")),
2198
                Some(&sval::Label::new("A")),
2199
                Some(&sval::Index::new(1)),
2200
            )
2201
            .unwrap();
2202
2203
        value
2204
            .tag(
2205
                None,
2206
                Some(&sval::Label::new("B")),
2207
                Some(&sval::Index::new(0)),
2208
            )
2209
            .unwrap();
2210
2211
        value
2212
            .enum_end(
2213
                Some(&sval::Tag::new("test")),
2214
                Some(&sval::Label::new("A")),
2215
                Some(&sval::Index::new(1)),
2216
            )
2217
            .unwrap();
2218
2219
        let expected = vec![
2220
            ValuePart {
2221
                kind: ValueKind::Enum {
2222
                    len: 1,
2223
                    tag: Some(sval::Tag::new("test")),
2224
                    label: Some(sval::Label::new("A")),
2225
                    index: Some(sval::Index::new(1)),
2226
                },
2227
            },
2228
            ValuePart {
2229
                kind: ValueKind::Tag {
2230
                    tag: None,
2231
                    label: Some(sval::Label::new("B")),
2232
                    index: Some(sval::Index::new(0)),
2233
                },
2234
            },
2235
        ];
2236
2237
        assert_eq!(expected, &*value.parts);
2238
    }
2239
2240
    #[test]
2241
    fn buffer_tag_hints() {
2242
        let mut value = ValueBuf::new();
2243
2244
        value.tag_hint(&sval::Tag::new("test")).unwrap();
2245
2246
        value.seq_begin(Some(2)).unwrap();
2247
2248
        value.seq_value_begin().unwrap();
2249
        value.tag_hint(&sval::Tag::new("test")).unwrap();
2250
        value.bool(false).unwrap();
2251
        value.seq_value_end().unwrap();
2252
2253
        value.seq_value_begin().unwrap();
2254
        value.bool(true).unwrap();
2255
        value.seq_value_end().unwrap();
2256
2257
        value.seq_end().unwrap();
2258
2259
        value.tag_hint(&sval::Tag::new("test")).unwrap();
2260
2261
        let expected = vec![
2262
            ValuePart {
2263
                kind: ValueKind::TagHint {
2264
                    tag: sval::Tag::new("test"),
2265
                },
2266
            },
2267
            ValuePart {
2268
                kind: ValueKind::Seq {
2269
                    len: 5,
2270
                    num_entries_hint: Some(2),
2271
                },
2272
            },
2273
            ValuePart {
2274
                kind: ValueKind::SeqValue { len: 2 },
2275
            },
2276
            ValuePart {
2277
                kind: ValueKind::TagHint {
2278
                    tag: sval::Tag::new("test"),
2279
                },
2280
            },
2281
            ValuePart {
2282
                kind: ValueKind::Bool(false),
2283
            },
2284
            ValuePart {
2285
                kind: ValueKind::SeqValue { len: 1 },
2286
            },
2287
            ValuePart {
2288
                kind: ValueKind::Bool(true),
2289
            },
2290
            ValuePart {
2291
                kind: ValueKind::TagHint {
2292
                    tag: sval::Tag::new("test"),
2293
                },
2294
            },
2295
        ];
2296
2297
        assert_eq!(expected, &*value.parts);
2298
    }
2299
2300
    #[test]
2301
    fn buffer_roundtrip() {
2302
        for value_1 in [
2303
            ValueBuf::collect(&42i32).unwrap(),
2304
            ValueBuf::collect(&vec![
2305
                vec![],
2306
                vec![vec![1, 2, 3], vec![4]],
2307
                vec![vec![5, 6], vec![7, 8, 9]],
2308
            ])
2309
            .unwrap(),
2310
            ValueBuf::collect(&{
2311
                #[derive(Value)]
2312
                struct Record {
2313
                    a: i32,
2314
                    b: bool,
2315
                }
2316
2317
                Record { a: 42, b: true }
2318
            })
2319
            .unwrap(),
2320
            ValueBuf::collect(&{
2321
                #[derive(Value)]
2322
                struct Tuple(i32, bool);
2323
2324
                Tuple(42, true)
2325
            })
2326
            .unwrap(),
2327
            ValueBuf::collect(&{
2328
                #[derive(Value)]
2329
                enum Enum {
2330
                    A,
2331
                }
2332
2333
                Enum::A
2334
            })
2335
            .unwrap(),
2336
        ] {
2337
            let value_2 = ValueBuf::collect(&value_1).unwrap();
2338
2339
            assert_eq!(&*value_1.parts, &*value_2.parts, "{:?}", value_1);
2340
        }
2341
    }
2342
}