record_query/value/
protobuf.rs

1use std::fmt;
2
3use crate::error;
4use protobuf;
5use serde;
6
7use crate::value;
8use serde_protobuf;
9use serde_protobuf::descriptor;
10
11pub struct Source<'a>(serde_protobuf::de::Deserializer<'a>, bool);
12
13#[inline]
14pub fn source<'a>(
15    descriptors: &'a descriptor::Descriptors,
16    message_name: &str,
17    input: protobuf::CodedInputStream<'a>,
18) -> error::Result<Source<'a>> {
19    let de = serde_protobuf::de::Deserializer::for_named_message(descriptors, message_name, input)?;
20    Ok(Source(de, true))
21}
22
23impl<'a> value::Source for Source<'a> {
24    #[inline]
25    fn read(&mut self) -> error::Result<Option<value::Value>> {
26        if self.1 {
27            self.1 = false;
28            match serde::Deserialize::deserialize(&mut self.0)
29                .map_err(serde_protobuf::error::CompatError::into_error)
30            {
31                Ok(v) => Ok(Some(v)),
32                Err(serde_protobuf::error::Error::EndOfStream) => Ok(None),
33                Err(e) => Err(error::Error::from(e)),
34            }
35        } else {
36            Ok(None)
37        }
38    }
39}
40
41impl<'a> fmt::Debug for Source<'a> {
42    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
43        f.debug_struct("ProtobufSource").finish()
44    }
45}