pub struct AbxStreamParser<R: Read> { /* private fields */ }Expand description
A pull parser that reads an ABX document from any Read source.
The input is read in 4 KiB chunks into an internal buffer, which only grows
to fit a single value larger than that. Same methods as
AbxParser; it also implements Iterator, yielding
Result<Event>.
§Examples
use android_abx::{AbxStreamParser, Event};
let parser = AbxStreamParser::new(&data[..])?;
let tags = parser
.filter(|ev| matches!(ev, Ok(Event::StartTag { .. })))
.count();
assert_eq!(tags, 1);Implementations§
Source§impl<R: Read> AbxStreamParser<R>
impl<R: Read> AbxStreamParser<R>
Sourcepub fn new(reader: R) -> Result<Self>
pub fn new(reader: R) -> Result<Self>
Creates a parser and reads the header from reader.
§Errors
Returns AbxError::Io if reading fails, AbxError::UnexpectedEof if
the input is shorter than 4 bytes, or AbxError::InvalidMagic if it does
not start with MAGIC.
Sourcepub fn next_event(&mut self) -> Result<Option<Event>>
pub fn next_event(&mut self) -> Result<Option<Event>>
Reads the next event, or returns None at the end of the input.
§Errors
Returns an error if the input is truncated or malformed (unknown token,
invalid interned-string index, invalid UTF-8).
Also returns AbxError::Io if reading fails.
On error, the parser is left at the start of the failing event.
Sourcepub fn collect_events(&mut self) -> Result<Vec<Event>>
pub fn collect_events(&mut self) -> Result<Vec<Event>>
Reads all remaining events into a Vec.
§Errors
Returns an error if the input is truncated or malformed (unknown token,
invalid interned-string index, invalid UTF-8).
Also returns AbxError::Io if reading fails.
Sourcepub fn find_attribute(
&mut self,
element: &str,
attr: &str,
) -> Result<Option<AttributeValue>>
pub fn find_attribute( &mut self, element: &str, attr: &str, ) -> Result<Option<AttributeValue>>
Returns the value of attribute attr on the next <element> tag that has it.
Events are consumed up to and including the matching tag. Returns Ok(None)
if the document ends first.
§Errors
Returns an error if the input is truncated or malformed (unknown token,
invalid interned-string index, invalid UTF-8).
Also returns AbxError::Io if reading fails.
§Examples
use android_abx::{AbxStreamParser, AttributeValue};
let mut parser = AbxStreamParser::new(&data[..])?;
let name = parser.find_attribute("pkg", "name")?;
assert_eq!(name, Some(AttributeValue::String("com.example.chat".into())));Sourcepub fn find_all_attributes(
&mut self,
element: &str,
attr: &str,
) -> Result<Vec<AttributeValue>>
pub fn find_all_attributes( &mut self, element: &str, attr: &str, ) -> Result<Vec<AttributeValue>>
Returns the value of attribute attr on every remaining <element> tag.
Tags without attr are skipped. Consumes the rest of the document.
§Errors
Returns an error if the input is truncated or malformed (unknown token,
invalid interned-string index, invalid UTF-8).
Also returns AbxError::Io if reading fails.
Sourcepub fn attributes_of(&mut self, element: &str) -> Result<Option<Vec<Attribute>>>
pub fn attributes_of(&mut self, element: &str) -> Result<Option<Vec<Attribute>>>
Returns the attributes of the next <element> tag.
Events are consumed up to and including the matching tag. Returns Ok(None)
if the document ends first.
§Errors
Returns an error if the input is truncated or malformed (unknown token,
invalid interned-string index, invalid UTF-8).
Also returns AbxError::Io if reading fails.
Sourcepub fn all_attributes_of(
&mut self,
element: &str,
) -> Result<Vec<Vec<Attribute>>>
pub fn all_attributes_of( &mut self, element: &str, ) -> Result<Vec<Vec<Attribute>>>
Returns the attributes of every remaining <element> tag.
Consumes the rest of the document.
§Errors
Returns an error if the input is truncated or malformed (unknown token,
invalid interned-string index, invalid UTF-8).
Also returns AbxError::Io if reading fails.
Sourcepub fn deserialize_next<T: DeserializeOwned>(
&mut self,
element: &str,
) -> Result<Option<T>>
Available on crate feature serde only.
pub fn deserialize_next<T: DeserializeOwned>( &mut self, element: &str, ) -> Result<Option<T>>
serde only.Deserializes the next <element> into T.
Events are consumed up to and including the element’s closing tag. Returns
Ok(None) if the document ends first. See
Deserializing with serde for how fields are
matched.
§Errors
Returns a parse error if the input is malformed, or
AbxError::Deserialization(crate::AbxError::Deserialization) if the element
does not match T.
§Examples
use android_abx::AbxStreamParser;
use serde::Deserialize;
#[derive(Deserialize)]
struct Permission {
name: String,
}
#[derive(Deserialize)]
struct Pkg {
name: String,
description: String,
permission: Vec<Permission>,
}
let mut parser = AbxStreamParser::new(&data[..])?;
let pkg: Pkg = parser.deserialize_next("pkg")?.unwrap();
assert_eq!(pkg.name, "com.example.chat");
assert_eq!(pkg.description, "A chat app");
assert_eq!(pkg.permission.len(), 2);Sourcepub fn deserialize_all<T: DeserializeOwned>(
&mut self,
element: &str,
) -> Result<Vec<T>>
Available on crate feature serde only.
pub fn deserialize_all<T: DeserializeOwned>( &mut self, element: &str, ) -> Result<Vec<T>>
serde only.Sourcepub fn deserialize_iter<'p, T: DeserializeOwned>(
&'p mut self,
element: &'p str,
) -> DeserializeIter<'p, R, T> ⓘ
Available on crate feature serde only.
pub fn deserialize_iter<'p, T: DeserializeOwned>( &'p mut self, element: &'p str, ) -> DeserializeIter<'p, R, T> ⓘ
serde only.Returns an iterator that deserializes each remaining <element> into T.
Elements are read one at a time, so memory use does not grow with the document.
§Examples
use android_abx::AbxStreamParser;
use serde::Deserialize;
#[derive(Deserialize)]
struct Permission {
name: String,
}
let mut parser = AbxStreamParser::new(&data[..])?;
let names = parser
.deserialize_iter::<Permission>("permission")
.map(|p| p.map(|p| p.name))
.collect::<Result<Vec<_>, _>>()?;
assert_eq!(names, ["INTERNET", "CAMERA"]);Sourcepub fn to_xml(&mut self) -> Result<String>
pub fn to_xml(&mut self) -> Result<String>
Renders the remaining events as an XML string.
The output starts with an <?xml ...?> declaration. Text and attribute values
are escaped; empty elements are written as an opening and a closing tag.
§Errors
Returns an error if the input is truncated or malformed (unknown token,
invalid interned-string index, invalid UTF-8).
Also returns AbxError::Io if reading fails.
§Examples
use android_abx::AbxStreamParser;
let xml = AbxStreamParser::new(&data[..])?.to_xml()?;
assert!(xml.ends_with(r#"<pkg name="com.example.chat" version="3" flags="1"></pkg>"#));Sourcepub fn write_xml(&mut self, writer: &mut impl Write) -> Result<()>
pub fn write_xml(&mut self, writer: &mut impl Write) -> Result<()>
Writes the remaining events as XML to writer.
Same output as to_xml, without building the whole string
in memory.
§Errors
Returns an error if the input is truncated or malformed (unknown token,
invalid interned-string index, invalid UTF-8).
Also returns AbxError::Io(crate::AbxError::Io) if reading or writing fails.
Sourcepub fn into_map(self) -> Result<HashMap<String, Vec<HashMap<String, String>>>>
pub fn into_map(self) -> Result<HashMap<String, Vec<HashMap<String, String>>>>
Collects the attributes of every remaining tag, grouped by tag name.
Values are rendered with AttributeValue::as_str.
Text and nesting are discarded.
§Errors
Returns an error if the input is truncated or malformed (unknown token,
invalid interned-string index, invalid UTF-8).
Also returns AbxError::Io if reading fails.
Sourcepub fn into_inner(self) -> R
pub fn into_inner(self) -> R
Returns the underlying reader. Bytes already buffered but not parsed are lost.
Trait Implementations§
Source§impl<R: Read> Iterator for AbxStreamParser<R>
impl<R: Read> Iterator for AbxStreamParser<R>
Source§fn next(&mut self) -> Option<Self::Item>
fn next(&mut self) -> Option<Self::Item>
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 (const: unstable) · Source§fn size_hint(&self) -> (usize, Option<usize>)
fn size_hint(&self) -> (usize, Option<usize>)
1.0.0 (const: unstable) · Source§fn count(self) -> usizewhere
Self: Sized,
fn count(self) -> usizewhere
Self: Sized,
1.0.0 (const: unstable) · 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 (const: unstable) · Source§fn nth(&mut self, n: usize) -> Option<Self::Item>
fn nth(&mut self, n: usize) -> Option<Self::Item>
nth element of the iterator. Read more1.28.0 (const: unstable) · 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 (const: unstable) · 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 (const: unstable) · 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 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 items of the original iterator. Read more1.0.0 (const: unstable) · Source§fn map<B, F>(self, f: F) -> Map<Self, F> ⓘ
fn map<B, F>(self, f: F) -> Map<Self, F> ⓘ
1.21.0 (const: unstable) · Source§fn for_each<F>(self, f: F)
fn for_each<F>(self, f: F)
1.0.0 (const: unstable) · Source§fn filter<P>(self, predicate: P) -> Filter<Self, P> ⓘ
fn filter<P>(self, predicate: P) -> Filter<Self, P> ⓘ
1.0.0 (const: unstable) · 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 (const: unstable) · Source§fn enumerate(self) -> Enumerate<Self> ⓘwhere
Self: Sized,
fn enumerate(self) -> Enumerate<Self> ⓘwhere
Self: Sized,
1.0.0 (const: unstable) · Source§fn take_while<P>(self, predicate: P) -> TakeWhile<Self, P> ⓘ
fn take_while<P>(self, predicate: P) -> TakeWhile<Self, P> ⓘ
1.57.0 (const: unstable) · 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 (const: unstable) · 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 (const: unstable) · 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 (const: unstable) · Source§fn scan<St, B, F>(self, initial_state: St, f: F) -> Scan<Self, St, F> ⓘ
fn scan<St, B, F>(self, initial_state: St, f: F) -> Scan<Self, St, F> ⓘ
1.0.0 (const: unstable) · 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 (const: unstable) · 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 (const: unstable) · Source§fn inspect<F>(self, f: F) -> Inspect<Self, F> ⓘ
fn inspect<F>(self, f: F) -> Inspect<Self, F> ⓘ
1.0.0 (const: unstable) · Source§fn by_ref(&mut self) -> &mut Selfwhere
Self: Sized,
fn by_ref(&mut self) -> &mut Selfwhere
Self: Sized,
Iterator. Read more1.0.0 (const: unstable) · Source§fn collect<B>(self) -> B
fn collect<B>(self) -> B
Source§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 (const: unstable) · 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 (const: unstable) · 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 (const: unstable) · 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 (const: unstable) · Source§fn fold<B, F>(self, init: B, f: F) -> B
fn fold<B, F>(self, init: B, f: F) -> B
1.51.0 (const: unstable) · 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 (const: unstable) · Source§fn all<F>(&mut self, f: F) -> bool
fn all<F>(&mut self, f: F) -> bool
1.0.0 (const: unstable) · Source§fn any<F>(&mut self, f: F) -> bool
fn any<F>(&mut self, f: F) -> bool
1.0.0 (const: unstable) · Source§fn find<P>(&mut self, predicate: P) -> Option<Self::Item>
fn find<P>(&mut self, predicate: P) -> Option<Self::Item>
1.30.0 (const: unstable) · 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 (const: unstable) · Source§fn position<P>(&mut self, predicate: P) -> Option<usize>
fn position<P>(&mut self, predicate: P) -> Option<usize>
1.0.0 (const: unstable) · Source§fn max(self) -> Option<Self::Item>
fn max(self) -> Option<Self::Item>
1.0.0 (const: unstable) · Source§fn min(self) -> Option<Self::Item>
fn min(self) -> Option<Self::Item>
1.6.0 (const: unstable) · 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 (const: unstable) · Source§fn max_by<F>(self, compare: F) -> Option<Self::Item>
fn max_by<F>(self, compare: F) -> Option<Self::Item>
1.6.0 (const: unstable) · 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 (const: unstable) · Source§fn min_by<F>(self, compare: F) -> Option<Self::Item>
fn min_by<F>(self, compare: F) -> Option<Self::Item>
1.0.0 (const: unstable) · Source§fn unzip<A, B, FromA, FromB>(self) -> (FromA, FromB)
fn unzip<A, B, FromA, FromB>(self) -> (FromA, FromB)
1.36.0 (const: unstable) · 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 (const: unstable) · 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 (const: unstable) · 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 (const: unstable) · 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 (const: unstable) · 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 (const: unstable) · 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 (const: unstable) · 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 more