pub struct Unescape<'a> { /* private fields */ }
Expand description
A streaming JSON string unescaper.
This struct is created by the unescape
function. It implements an Iterator
that yields Result<&'a [u8], UnescapeError>
, lazily decoding the input.
The iterator’s output chunks are one of the following:
Ok(&'a [u8])
: A borrowed slice of the original input for a sequence of non-escaped bytes.Ok(&'static [u8])
: A single-byte slice for a decoded escape sequence (e.g.,\n
becomes a slice containing0x0A
). For\uXXXX
sequences, it yields a series of single-byte slices representing the UTF-8 encoding of the character.Err(UnescapeError)
: An error indicating an invalid escape sequence, which halts further iteration as described below.
Because the iterator operates on bytes, you can use helper methods like
Unescape::decode_utf8
or Unescape::decode_utf8_lossy
to convert the
final result into a string.
§Error Handling
When the iterator encounters an invalid or incomplete escape, it returns an
Err(UnescapeError)
describing the problem. The iterator then remains in an
error state: subsequent calls to next()
will continue to return that same
error (i.e., the error is idempotent) and the iterator will not produce further
Ok
chunks. This makes the behavior deterministic for callers that check the
first error and then stop.
Errors are classified by the precise condition encountered:
InvalidEscape
: The escape sequence uses an unknown escape character (e.g.,\q
).InvalidHex
: A\u
escape contains a non-hex character where a hex digit was expected (e.g.,\uZ
).UnexpectedEof
: The input ended before a complete escape sequence could be read. This is used when there isn’t enough input yet to decide whether the sequence would be valid (for instance, an incomplete\u
or a truncated surrogate pair).LoneSurrogate
: A complete\uXXXX
was read, and it encodes a high surrogate, but the following bytes definitively do not form a valid low surrogate escape (for example, the next character is a space or any non-\u
character).
The difference between UnexpectedEof
and LoneSurrogate
is important:
UnexpectedEof
means we couldn’t decide because the input ended too early.LoneSurrogate
means we did decide—we saw a full\uXXXX
high surrogate, and the following input proves a pair will not follow.
§Concrete examples
- A high surrogate followed by other data (not a
\u
low-surrogate) →LoneSurrogate
:
use json_escape::{unescape, UnescapeErrorKind, LoneSurrogateError};
let mut iter = unescape(r"\uD83D more data");
let err = iter.next().unwrap().unwrap_err();
assert!(matches!(err.kind(), UnescapeErrorKind::LoneSurrogate(LoneSurrogateError { surrogate: 0xD83D, .. })));
// Subsequent calls return the same error (iterator remains in the same error state).
let err = iter.next().unwrap().unwrap_err();
assert!(matches!(err.kind(), UnescapeErrorKind::LoneSurrogate(LoneSurrogateError { surrogate: 0xD83D, .. })));
- An invalid escape character →
InvalidEscape
:
use json_escape::{unescape, UnescapeErrorKind, InvalidEscapeError};
let mut iter = unescape(r"\q"); // `\q` is not a defined escape
let err = iter.next().unwrap().unwrap_err();
assert!(matches!(err.kind(), UnescapeErrorKind::InvalidEscape(InvalidEscapeError { found: b'q', .. })));
- A malformed
\u
with a non-hex character →InvalidHex
:
use json_escape::{unescape, UnescapeErrorKind, InvalidHexError};
let mut iter = unescape(r"\uZ");
let err = iter.next().unwrap().unwrap_err();
assert!(matches!(err.kind(), UnescapeErrorKind::InvalidHex(InvalidHexError { found: b'Z', .. })));
- Truncated / incomplete input ⇒
UnexpectedEof
:
use json_escape::{unescape, UnescapeErrorKind};
// a) truncated after the first \uXXXX (no following bytes yet)
let mut iter = unescape(r"\uD83D");
let err = iter.next().unwrap().unwrap_err();
assert!(matches!(err.kind(), UnescapeErrorKind::UnexpectedEof));
// b) starts a second \u but is truncated before hex digits
let mut iter = unescape(r"\uD83D\u");
let err = iter.next().unwrap().unwrap_err();
assert!(matches!(err.kind(), UnescapeErrorKind::UnexpectedEof));
// c) a lone backslash at end of input
let mut iter = unescape("\\");
let err = iter.next().unwrap().unwrap_err();
assert!(matches!(err.kind(), UnescapeErrorKind::UnexpectedEof));
Note: This behavior intentionally mirrors common JSON parsers (e.g.,
serde_json
, Go’s encoding/json
) for the EOF vs. semantic error distinction.
§Implemented Traits and Usage
Iterator<Item = Result<&'a [u8], UnescapeError>>
: The core trait for processing the unescaped byte chunks.std::io::Read
(requiresstd
feature): Lets you use the unescaper as a standard reader, perfect for integrating with other I/O APIs.TryFrom<Unescape<'a>> for Cow<'a, [u8]>
(requiresalloc
feature): An efficient way to collect the unescaped bytes, propagating any errors.Clone
,Debug
: Standard utility traits.PartialEq<B: AsRef<[u8]>>
: Compares the fully unescaped output with a byte slice.
§Reading Unescaped Bytes
With the std
feature, Unescape
can be used as any other std::io::Read
source. This is ideal for streaming and decoding large JSON string contents
without buffering the entire result in memory first.
use json_escape::unescape;
use std::io::Read;
let mut reader = unescape(r#"chunk1\nchunk2"#);
let mut buf = Vec::new();
// Read all unescaped bytes from the iterator into the buffer.
reader.read_to_end(&mut buf).unwrap();
assert_eq!(buf, b"chunk1\nchunk2");
Implementations§
Source§impl<'a> Unescape<'a>
impl<'a> Unescape<'a>
Sourcepub fn decode_utf8(self) -> Result<Cow<'a, str>, DecodeUtf8Error>
pub fn decode_utf8(self) -> Result<Cow<'a, str>, DecodeUtf8Error>
Decodes the unescaped byte stream into a UTF-8 string.
This method consumes the iterator and collects all resulting byte chunks. If an unescaping error occurs, it’s returned immediately. If the final sequence of bytes is not valid UTF-8, a UTF-8 error is returned.
Like From<Escape>
, this is optimized to return a Cow::Borrowed
if no
escapes were present in the input, avoiding allocation.
Requires the alloc
feature.
§Example
use json_escape::unescape;
let input = r#"Emoji: \uD83D\uDE00"#;
let cow = unescape(input).decode_utf8().unwrap();
assert_eq!(cow, "Emoji: 😀");
Sourcepub fn decode_utf8_lossy(self) -> Result<Cow<'a, str>, UnescapeError>
pub fn decode_utf8_lossy(self) -> Result<Cow<'a, str>, UnescapeError>
Decodes the unescaped byte stream lossily into a UTF-8 string.
This is similar to Unescape::decode_utf8
but replaces any invalid UTF-8 sequences
with the replacement character (U+FFFD) instead of returning an error.
An UnescapeError
can still be returned if the JSON escaping itself is invalid.
Requires the alloc
feature.
Sourcepub fn display_utf8(self) -> DisplayUnescape<'a>
pub fn display_utf8(self) -> DisplayUnescape<'a>
Returns a wrapper that implements fmt::Display
.
This allows an Unescape
iterator to be used directly with formatting
macros like println!
, format!
, etc. It writes the unescaped content
directly to the formatter’s buffer, avoiding any heap allocations.
The iterator is consumed, and the resulting unescaped string is written
to the formatter. Any invalid JSON escape sequences or invalid UTF-8 will
cause a fmt::Error
. You should be cautious when using this method
with the format!
macro, as a fmt::Error
from us will cause the macro
to panic.
For a more robust alternative that will not panic on UnescapeError
or
invalid bytes, consider using Unescape::display_utf8_lossy
instead.
This method is a zero-allocation alternative to Unescape::decode_utf8
,
which might allocate a String
to return the unescaped content.
§Example
use json_escape::unescape;
let original = r#"Hello, \uD83C\uDF0E!"#;
let unescaper = unescape(original);
let formatted = format!("{}", unescaper.display_utf8());
assert_eq!(formatted, "Hello, 🌎!");
Sourcepub fn display_utf8_lossy(self) -> DisplayUnescapeLossy<'a>
pub fn display_utf8_lossy(self) -> DisplayUnescapeLossy<'a>
Returns a wrapper that implements fmt::Display
lossily.
This method is an allocation-free way to write unescaped content to a formatter. It handles invalid JSON escape sequences and invalid UTF-8 gracefully, making it a “lossy” operation.
- Invalid JSON escape sequences: Instead of causing an error, the iterator terminates without an error.
- Invalid UTF-8 bytes: These are replaced with the Unicode replacement character (U+FFFD).
This method is the zero-allocation counterpart to Unescape::decode_utf8_lossy
.
Trait Implementations§
Source§impl<'a> Iterator for Unescape<'a>
impl<'a> Iterator for Unescape<'a>
Source§fn next(&mut self) -> Option<Self::Item>
fn next(&mut self) -> Option<Self::Item>
Source§fn size_hint(&self) -> (usize, Option<usize>)
fn size_hint(&self) -> (usize, Option<usize>)
Source§fn next_chunk<const N: usize>(
&mut self,
) -> Result<[Self::Item; N], IntoIter<Self::Item, N>>where
Self: Sized,
fn next_chunk<const N: usize>(
&mut self,
) -> Result<[Self::Item; N], IntoIter<Self::Item, N>>where
Self: Sized,
iter_next_chunk
)N
values. Read more1.0.0 · Source§fn count(self) -> usizewhere
Self: Sized,
fn count(self) -> usizewhere
Self: Sized,
1.0.0 · Source§fn last(self) -> Option<Self::Item>where
Self: Sized,
fn last(self) -> Option<Self::Item>where
Self: Sized,
Source§fn advance_by(&mut self, n: usize) -> Result<(), NonZero<usize>>
fn advance_by(&mut self, n: usize) -> Result<(), NonZero<usize>>
iter_advance_by
)n
elements. Read more1.0.0 · Source§fn nth(&mut self, n: usize) -> Option<Self::Item>
fn nth(&mut self, n: usize) -> Option<Self::Item>
n
th element of the iterator. Read more1.28.0 · Source§fn step_by(self, step: usize) -> StepBy<Self>where
Self: Sized,
fn step_by(self, step: usize) -> StepBy<Self>where
Self: Sized,
1.0.0 · Source§fn chain<U>(self, other: U) -> Chain<Self, <U as IntoIterator>::IntoIter>
fn chain<U>(self, other: U) -> Chain<Self, <U as IntoIterator>::IntoIter>
1.0.0 · Source§fn zip<U>(self, other: U) -> Zip<Self, <U as IntoIterator>::IntoIter>where
Self: Sized,
U: IntoIterator,
fn zip<U>(self, other: U) -> Zip<Self, <U as IntoIterator>::IntoIter>where
Self: Sized,
U: IntoIterator,
Source§fn intersperse(self, separator: Self::Item) -> Intersperse<Self>
fn intersperse(self, separator: Self::Item) -> Intersperse<Self>
iter_intersperse
)separator
between adjacent
items of the original iterator. Read moreSource§fn intersperse_with<G>(self, separator: G) -> IntersperseWith<Self, G>
fn intersperse_with<G>(self, separator: G) -> IntersperseWith<Self, G>
iter_intersperse
)separator
between adjacent items of the original iterator. Read more1.0.0 · Source§fn map<B, F>(self, f: F) -> Map<Self, F>
fn map<B, F>(self, f: F) -> Map<Self, F>
1.0.0 · Source§fn filter<P>(self, predicate: P) -> Filter<Self, P>
fn filter<P>(self, predicate: P) -> Filter<Self, P>
1.0.0 · Source§fn filter_map<B, F>(self, f: F) -> FilterMap<Self, F>
fn filter_map<B, F>(self, f: F) -> FilterMap<Self, F>
1.0.0 · Source§fn enumerate(self) -> Enumerate<Self>where
Self: Sized,
fn enumerate(self) -> Enumerate<Self>where
Self: Sized,
1.0.0 · Source§fn skip_while<P>(self, predicate: P) -> SkipWhile<Self, P>
fn skip_while<P>(self, predicate: P) -> SkipWhile<Self, P>
1.0.0 · Source§fn take_while<P>(self, predicate: P) -> TakeWhile<Self, P>
fn take_while<P>(self, predicate: P) -> TakeWhile<Self, P>
1.57.0 · Source§fn map_while<B, P>(self, predicate: P) -> MapWhile<Self, P>
fn map_while<B, P>(self, predicate: P) -> MapWhile<Self, P>
1.0.0 · Source§fn skip(self, n: usize) -> Skip<Self>where
Self: Sized,
fn skip(self, n: usize) -> Skip<Self>where
Self: Sized,
n
elements. Read more1.0.0 · Source§fn take(self, n: usize) -> Take<Self>where
Self: Sized,
fn take(self, n: usize) -> Take<Self>where
Self: Sized,
n
elements, or fewer
if the underlying iterator ends sooner. Read more1.0.0 · Source§fn flat_map<U, F>(self, f: F) -> FlatMap<Self, U, F>
fn flat_map<U, F>(self, f: F) -> FlatMap<Self, U, F>
1.29.0 · Source§fn flatten(self) -> Flatten<Self>
fn flatten(self) -> Flatten<Self>
Source§fn map_windows<F, R, const N: usize>(self, f: F) -> MapWindows<Self, F, N>
fn map_windows<F, R, const N: usize>(self, f: F) -> MapWindows<Self, F, N>
iter_map_windows
)f
for each contiguous window of size N
over
self
and returns an iterator over the outputs of f
. Like slice::windows()
,
the windows during mapping overlap as well. Read more1.0.0 · Source§fn inspect<F>(self, f: F) -> Inspect<Self, F>
fn inspect<F>(self, f: F) -> Inspect<Self, F>
1.0.0 · Source§fn by_ref(&mut self) -> &mut Selfwhere
Self: Sized,
fn by_ref(&mut self) -> &mut Selfwhere
Self: Sized,
Iterator
. Read moreSource§fn try_collect<B>(
&mut self,
) -> <<Self::Item as Try>::Residual as Residual<B>>::TryType
fn try_collect<B>( &mut self, ) -> <<Self::Item as Try>::Residual as Residual<B>>::TryType
iterator_try_collect
)Source§fn collect_into<E>(self, collection: &mut E) -> &mut E
fn collect_into<E>(self, collection: &mut E) -> &mut E
iter_collect_into
)1.0.0 · Source§fn partition<B, F>(self, f: F) -> (B, B)
fn partition<B, F>(self, f: F) -> (B, B)
Source§fn is_partitioned<P>(self, predicate: P) -> bool
fn is_partitioned<P>(self, predicate: P) -> bool
iter_is_partitioned
)true
precede all those that return false
. Read more1.27.0 · Source§fn try_fold<B, F, R>(&mut self, init: B, f: F) -> R
fn try_fold<B, F, R>(&mut self, init: B, f: F) -> R
1.27.0 · Source§fn try_for_each<F, R>(&mut self, f: F) -> R
fn try_for_each<F, R>(&mut self, f: F) -> R
1.0.0 · Source§fn fold<B, F>(self, init: B, f: F) -> B
fn fold<B, F>(self, init: B, f: F) -> B
1.51.0 · Source§fn reduce<F>(self, f: F) -> Option<Self::Item>
fn reduce<F>(self, f: F) -> Option<Self::Item>
Source§fn try_reduce<R>(
&mut self,
f: impl FnMut(Self::Item, Self::Item) -> R,
) -> <<R as Try>::Residual as Residual<Option<<R as Try>::Output>>>::TryType
fn try_reduce<R>( &mut self, f: impl FnMut(Self::Item, Self::Item) -> R, ) -> <<R as Try>::Residual as Residual<Option<<R as Try>::Output>>>::TryType
iterator_try_reduce
)1.0.0 · Source§fn all<F>(&mut self, f: F) -> bool
fn all<F>(&mut self, f: F) -> bool
1.0.0 · Source§fn any<F>(&mut self, f: F) -> bool
fn any<F>(&mut self, f: F) -> bool
1.0.0 · Source§fn find<P>(&mut self, predicate: P) -> Option<Self::Item>
fn find<P>(&mut self, predicate: P) -> Option<Self::Item>
1.30.0 · Source§fn find_map<B, F>(&mut self, f: F) -> Option<B>
fn find_map<B, F>(&mut self, f: F) -> Option<B>
Source§fn try_find<R>(
&mut self,
f: impl FnMut(&Self::Item) -> R,
) -> <<R as Try>::Residual as Residual<Option<Self::Item>>>::TryType
fn try_find<R>( &mut self, f: impl FnMut(&Self::Item) -> R, ) -> <<R as Try>::Residual as Residual<Option<Self::Item>>>::TryType
try_find
)1.0.0 · Source§fn position<P>(&mut self, predicate: P) -> Option<usize>
fn position<P>(&mut self, predicate: P) -> Option<usize>
1.0.0 · Source§fn max(self) -> Option<Self::Item>
fn max(self) -> Option<Self::Item>
1.0.0 · Source§fn min(self) -> Option<Self::Item>
fn min(self) -> Option<Self::Item>
1.6.0 · Source§fn max_by_key<B, F>(self, f: F) -> Option<Self::Item>
fn max_by_key<B, F>(self, f: F) -> Option<Self::Item>
1.15.0 · Source§fn max_by<F>(self, compare: F) -> Option<Self::Item>
fn max_by<F>(self, compare: F) -> Option<Self::Item>
1.6.0 · Source§fn min_by_key<B, F>(self, f: F) -> Option<Self::Item>
fn min_by_key<B, F>(self, f: F) -> Option<Self::Item>
1.15.0 · Source§fn min_by<F>(self, compare: F) -> Option<Self::Item>
fn min_by<F>(self, compare: F) -> Option<Self::Item>
1.0.0 · Source§fn unzip<A, B, FromA, FromB>(self) -> (FromA, FromB)
fn unzip<A, B, FromA, FromB>(self) -> (FromA, FromB)
1.36.0 · Source§fn copied<'a, T>(self) -> Copied<Self>
fn copied<'a, T>(self) -> Copied<Self>
Source§fn array_chunks<const N: usize>(self) -> ArrayChunks<Self, N>where
Self: Sized,
fn array_chunks<const N: usize>(self) -> ArrayChunks<Self, N>where
Self: Sized,
iter_array_chunks
)N
elements of the iterator at a time. Read more1.11.0 · Source§fn product<P>(self) -> P
fn product<P>(self) -> P
Source§fn cmp_by<I, F>(self, other: I, cmp: F) -> Ordering
fn cmp_by<I, F>(self, other: I, cmp: F) -> Ordering
iter_order_by
)Iterator
with those
of another with respect to the specified comparison function. Read more1.5.0 · Source§fn partial_cmp<I>(self, other: I) -> Option<Ordering>
fn partial_cmp<I>(self, other: I) -> Option<Ordering>
PartialOrd
elements of
this Iterator
with those of another. The comparison works like short-circuit
evaluation, returning a result without comparing the remaining elements.
As soon as an order can be determined, the evaluation stops and a result is returned. Read moreSource§fn partial_cmp_by<I, F>(self, other: I, partial_cmp: F) -> Option<Ordering>where
Self: Sized,
I: IntoIterator,
F: FnMut(Self::Item, <I as IntoIterator>::Item) -> Option<Ordering>,
fn partial_cmp_by<I, F>(self, other: I, partial_cmp: F) -> Option<Ordering>where
Self: Sized,
I: IntoIterator,
F: FnMut(Self::Item, <I as IntoIterator>::Item) -> Option<Ordering>,
iter_order_by
)Iterator
with those
of another with respect to the specified comparison function. Read moreSource§fn eq_by<I, F>(self, other: I, eq: F) -> bool
fn eq_by<I, F>(self, other: I, eq: F) -> bool
iter_order_by
)1.5.0 · Source§fn lt<I>(self, other: I) -> bool
fn lt<I>(self, other: I) -> bool
Iterator
are lexicographically
less than those of another. Read more1.5.0 · Source§fn le<I>(self, other: I) -> bool
fn le<I>(self, other: I) -> bool
Iterator
are lexicographically
less or equal to those of another. Read more1.5.0 · Source§fn gt<I>(self, other: I) -> bool
fn gt<I>(self, other: I) -> bool
Iterator
are lexicographically
greater than those of another. Read more1.5.0 · Source§fn ge<I>(self, other: I) -> bool
fn ge<I>(self, other: I) -> bool
Iterator
are lexicographically
greater than or equal to those of another. Read more1.82.0 · Source§fn is_sorted(self) -> bool
fn is_sorted(self) -> bool
1.82.0 · Source§fn is_sorted_by<F>(self, compare: F) -> bool
fn is_sorted_by<F>(self, compare: F) -> bool
1.82.0 · Source§fn is_sorted_by_key<F, K>(self, f: F) -> bool
fn is_sorted_by_key<F, K>(self, f: F) -> bool
Source§impl<B: AsRef<[u8]> + ?Sized> PartialEq<B> for Unescape<'_>
impl<B: AsRef<[u8]> + ?Sized> PartialEq<B> for Unescape<'_>
Source§fn eq(&self, other: &B) -> bool
fn eq(&self, other: &B) -> bool
Compares the unescaped output with a byte-slice-like object.
An Unescape
iterator is considered equal to a byte slice if it successfully
unescapes to produce a sequence of bytes identical to that slice. If the
iterator would produce an error, the comparison returns false
.
§Example
use json_escape::unescape;
let unescaper = unescape(r#"hello\nworld"#);
assert_eq!(unescaper, b"hello\nworld");
// An iterator that produces an error is not equal to any valid slice.
let failing_unescaper = unescape(r#"\k"#);
assert_ne!(failing_unescaper, b"k");
Source§impl<B: AsRef<[u8]>> PartialEq<Unescape<'_>> for Result<B, UnescapeError>
impl<B: AsRef<[u8]>> PartialEq<Unescape<'_>> for Result<B, UnescapeError>
Source§fn eq(&self, unescape: &Unescape<'_>) -> bool
fn eq(&self, unescape: &Unescape<'_>) -> bool
Compares the unescaper’s outcome with a Result
.
This implementation allows for precise testing of the Unescape
iterator
by comparing it against either a successful outcome (Ok
) or a specific
failure (Err
).
-
If
result
isOk(bytes)
, the comparison istrue
only if the iterator completes successfully and its concatenated output is identical tobytes
. -
If
result
isErr(error)
, the comparison istrue
only if the iterator produces the exact sameUnescapeError
.
§Example
use json_escape::{unescape, UnescapeError, InvalidEscapeError};
// --- Success Case ---
let unescaper = unescape(r#"hello\tworld"#);
// The comparison is against an `Ok` variant.
assert_eq!(Ok("hello\tworld"), unescaper);
// --- Error Case ---
let failing_unescaper = unescape(r#"invalid-\u"#);
// We can assert that the iterator produces a specific error.
assert_eq!(Err::<&str, _>(unexpected_eof), failing_unescaper);
Source§impl<'a, 'b> PartialEq<Unescape<'a>> for Unescape<'b>
impl<'a, 'b> PartialEq<Unescape<'a>> for Unescape<'b>
Source§fn eq(&self, other: &Unescape<'a>) -> bool
fn eq(&self, other: &Unescape<'a>) -> bool
Compares two Unescape
iterators for equality based on their terminal result.
The equality of two Unescape
iterators is determined by the final Result
that would be obtained if each iterator were fully consumed (e.g., by using try_collect()
).
The specific rules are as follows:
- Error vs. Error: If both iterators terminate with an
Err
, they are considered equal if and only if theirUnescapeError
s are identical. Any bytes successfully unescaped before the error are ignored in this case. - Success vs. Success: If both iterators terminate with
Ok
, they are considered equal if and only if the complete sequence of unescaped bytes is identical for both. - Success vs. Error: If one iterator terminates with
Ok
and the other withErr
, they are always not equal.
§Example
use json_escape::unescape;
// Case 1: Both iterators produce the same error. They are equal,
// even though their valid prefixes ("a" and "b") are different.
let failing_a = unescape(r#"a\k"#);
let failing_b = unescape(r#"b\k"#);
assert_eq!(failing_a, failing_b);
// Case 2: Both iterators succeed. Equality depends on the byte stream.
let successful_a = unescape(r#"hello\nworld"#);
let successful_b = unescape(r#"hello\nworld"#);
assert_eq!(successful_a, successful_b);
let successful_c = unescape(r#"different"#);
assert_ne!(successful_a, successful_c);
// Case 3: One succeeds and one fails. They are not equal.
let succeeding = unescape(r#"stop"#);
let failing = unescape(r#"stop\k"#);
assert_ne!(succeeding, failing);
// Case 4: Both iterators fail differently. They are not equal.
let failing_a = unescape(r#"data:\k"#);
let failing_b = unescape(r#"data:\"#);
assert_ne!(failing_a, failing_b);
Source§impl Read for Unescape<'_>
impl Read for Unescape<'_>
Source§fn read(&mut self, buf: &mut [u8]) -> Result<usize>
fn read(&mut self, buf: &mut [u8]) -> Result<usize>
Source§fn read_to_end(&mut self, buf: &mut Vec<u8>) -> Result<usize>
fn read_to_end(&mut self, buf: &mut Vec<u8>) -> Result<usize>
buf
. Read more1.36.0 · Source§fn read_vectored(&mut self, bufs: &mut [IoSliceMut<'_>]) -> Result<usize, Error>
fn read_vectored(&mut self, bufs: &mut [IoSliceMut<'_>]) -> Result<usize, Error>
read
, except that it reads into a slice of buffers. Read moreSource§fn is_read_vectored(&self) -> bool
fn is_read_vectored(&self) -> bool
can_vector
)1.0.0 · Source§fn read_to_string(&mut self, buf: &mut String) -> Result<usize, Error>
fn read_to_string(&mut self, buf: &mut String) -> Result<usize, Error>
buf
. Read more1.6.0 · Source§fn read_exact(&mut self, buf: &mut [u8]) -> Result<(), Error>
fn read_exact(&mut self, buf: &mut [u8]) -> Result<(), Error>
buf
. Read moreSource§fn read_buf(&mut self, buf: BorrowedCursor<'_>) -> Result<(), Error>
fn read_buf(&mut self, buf: BorrowedCursor<'_>) -> Result<(), Error>
read_buf
)Source§fn read_buf_exact(&mut self, cursor: BorrowedCursor<'_>) -> Result<(), Error>
fn read_buf_exact(&mut self, cursor: BorrowedCursor<'_>) -> Result<(), Error>
read_buf
)cursor
. Read more1.0.0 · Source§fn by_ref(&mut self) -> &mut Selfwhere
Self: Sized,
fn by_ref(&mut self) -> &mut Selfwhere
Self: Sized,
Read
. Read moreSource§impl<'a> TryFrom<Unescape<'a>> for Cow<'a, [u8]>
impl<'a> TryFrom<Unescape<'a>> for Cow<'a, [u8]>
Source§fn try_from(value: Unescape<'a>) -> Result<Self, Self::Error>
fn try_from(value: Unescape<'a>) -> Result<Self, Self::Error>
Efficiently collects the unescaped bytes into a Cow<'a, [u8]>
.
This implementation will return Cow::Borrowed
if the original input contained
no escape sequences, avoiding allocation. Otherwise, it returns Cow::Owned
.
If any UnescapeError
is encountered during iteration, the operation
halts and returns that error.
Requires the alloc
feature.