azalea_core/
filterable.rs

1use std::io::Cursor;
2
3use azalea_buf::{AzaleaRead, AzaleaReadLimited, AzaleaReadVar, AzaleaWrite};
4
5/// Used for written books.
6pub struct Filterable<T> {
7    pub raw: T,
8    pub filtered: Option<T>,
9}
10
11impl<T: AzaleaWrite> azalea_buf::AzaleaWrite for Filterable<T> {
12    fn azalea_write(&self, buf: &mut impl std::io::Write) -> Result<(), std::io::Error> {
13        self.raw.azalea_write(buf)?;
14        self.filtered.azalea_write(buf)?;
15        Ok(())
16    }
17}
18impl<T: AzaleaRead> azalea_buf::AzaleaRead for Filterable<T> {
19    fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, azalea_buf::BufReadError> {
20        let raw = AzaleaRead::azalea_read(buf)?;
21        let filtered = AzaleaRead::azalea_read(buf)?;
22        Ok(Self { raw, filtered })
23    }
24}
25impl<T: AzaleaReadLimited> azalea_buf::AzaleaReadLimited for Filterable<T> {
26    fn azalea_read_limited(
27        buf: &mut Cursor<&[u8]>,
28        limit: usize,
29    ) -> Result<Self, azalea_buf::BufReadError> {
30        let raw = AzaleaReadLimited::azalea_read_limited(buf, limit)?;
31        let filtered = AzaleaReadLimited::azalea_read_limited(buf, limit)?;
32        Ok(Self { raw, filtered })
33    }
34}
35impl<T: AzaleaReadVar> azalea_buf::AzaleaReadVar for Filterable<T> {
36    fn azalea_read_var(buf: &mut Cursor<&[u8]>) -> Result<Self, azalea_buf::BufReadError> {
37        let raw = AzaleaReadVar::azalea_read_var(buf)?;
38        let filtered = AzaleaReadVar::azalea_read_var(buf)?;
39        Ok(Self { raw, filtered })
40    }
41}
42
43impl<T: Clone> Clone for Filterable<T> {
44    fn clone(&self) -> Self {
45        Self {
46            raw: self.raw.clone(),
47            filtered: self.filtered.clone(),
48        }
49    }
50}
51impl<T: PartialEq> PartialEq for Filterable<T> {
52    fn eq(&self, other: &Self) -> bool {
53        self.raw == other.raw && self.filtered == other.filtered
54    }
55}