pub struct Unescape<'a> { /* private fields */ }
Expand description
An iterator over a byte slice that yields UnescapedChunk
s.
Created by the unescape
function.
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
into a Cow<[u8]>
, which is then validated as UTF-8. 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.
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::explicit::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
.
If an unescaping error or invalid UTF-8 sequence is encountered,
a fmt::Error
is returned, which will cause format!
and friends to panic.
Sourcepub fn display_utf8_lossy(self) -> DisplayUnescape<'a>
pub fn display_utf8_lossy(self) -> DisplayUnescape<'a>
Returns a wrapper that implements [fmt::Display
for lossy UTF-8 decoding.
Invalid UTF-8 sequences will be replaced with the replacement character.
An unescaping error will still result in a fmt::Error
.
Trait Implementations§
Source§impl<'a> Iterator for Unescape<'a>
impl<'a> Iterator for Unescape<'a>
Source§type Item = Result<UnescapedChunk<'a>, UnescapeError>
type Item = Result<UnescapedChunk<'a>, UnescapeError>
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§impl<B: AsRef<[u8]>> PartialEq<Unescape<'_>> for Result<B, UnescapeError>
impl<B: AsRef<[u8]>> PartialEq<Unescape<'_>> for Result<B, UnescapeError>
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::explicit::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<'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]>
.
Returns Cow::Borrowed
if no escape sequences were present, avoiding
allocation. Otherwise, returns Cow::Owned
. If an error occurs, it’s
returned immediately.