1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
use json::{json_minifier::JsonMinifier, read::byte_to_char::{ByteToChar, CharsError}};
use std::{fmt, io::{Error, ErrorKind, Read}, vec::IntoIter};

pub struct JsonRead<P, R> {
    minifier: JsonMinifier,
    read: Option<R>,
    iter: Option<ByteToChar<R>>,
    predicate: P,
    initialized: bool,
    item_iter: Option<IntoIter<u8>>,
    item1: Option<char>,
}

impl<P, R: Read> JsonRead<P, R> {
    #[inline]
    pub fn new(read: R, predicate: P) -> Self {
        JsonRead {
            minifier: JsonMinifier::default(),
            read: Some(read),
            iter: None,
            predicate,
            initialized: false,
            item_iter: None,
            item1: None,
        }
    }

    fn get_next(&mut self) -> Result<Option<char>, CharsError> {
        match self.iter.as_mut().unwrap().next() {
            None => Ok(None),
            Some(item) => match item {
                Ok(item) => Ok(Some(item)),
                Err(err) => Err(err)
            }
        }
    }

    fn add_char_to_buffer(&mut self, buf: &mut [u8], buf_pos: &mut usize) {
        if let Some(ref mut iter) = self.item_iter {
            while *buf_pos < buf.len() {
                if let Some(byte) = iter.next() {
                    buf[*buf_pos] = byte;
                    *buf_pos += 1;
                } else {
                    break;
                }
            }
        }
    }
}

impl<P, R: Read + fmt::Debug> fmt::Debug for JsonRead<P, R> {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        f.debug_struct("Filter")
         .field("iter", &self.iter)
         .field("initialized", &self.initialized)
         .finish()
    }
}

impl<P, R> Read for JsonRead<P, R>
    where
        R: Read,
        P: FnMut(
            &mut JsonMinifier,
            &char,
            Option<&char>,
        ) -> bool,
{
    fn read(&mut self, buf: &mut [u8]) -> Result<usize, Error> {
        let mut buf_pos: usize = 0;

        if buf.is_empty() {
            return Ok(0);
        }

        if !self.initialized {
            self.iter = Some(ByteToChar::new(self.read.take().unwrap(), buf.len())?);
            self.item1 = self.get_next()?;
            self.initialized = true;
        }

        while let Some(item) = self.item1.take() {
            self.item1 = self.get_next()?;
            if (self.predicate)(
                &mut self.minifier,
                &item,
                self.item1.as_ref(),
            ) {
                self.item_iter = Some(item.to_string().into_bytes().into_iter());
                self.add_char_to_buffer(buf, &mut buf_pos);
            }
            if buf_pos >= buf.len() {
                break;
            }
        }
        Ok(buf_pos)
    }
}

impl From<CharsError> for Error {
    fn from(_: CharsError) -> Self {
        Error::from(ErrorKind::InvalidData)
    }
}