Skip to main content

azalea_core/
filterable.rs

1use std::{
2    fmt::Debug,
3    io::{self, Cursor, Write},
4};
5
6use azalea_buf::{AzBuf, AzBufLimited, AzBufVar};
7
8/// Used for written books.
9#[cfg_attr(feature = "serde", derive(serde::Serialize))]
10pub struct Filterable<T> {
11    pub raw: T,
12    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
13    pub filtered: Option<T>,
14}
15
16impl<T: AzBuf> AzBuf for Filterable<T> {
17    fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, azalea_buf::BufReadError> {
18        let raw = AzBuf::azalea_read(buf)?;
19        let filtered = AzBuf::azalea_read(buf)?;
20        Ok(Self { raw, filtered })
21    }
22    fn azalea_write(&self, buf: &mut impl Write) -> io::Result<()> {
23        self.raw.azalea_write(buf)?;
24        self.filtered.azalea_write(buf)?;
25        Ok(())
26    }
27}
28impl<T: AzBufLimited> AzBufLimited for Filterable<T> {
29    fn azalea_read_limited(
30        buf: &mut Cursor<&[u8]>,
31        limit: u32,
32    ) -> Result<Self, azalea_buf::BufReadError> {
33        let raw = AzBufLimited::azalea_read_limited(buf, limit)?;
34        let filtered = AzBufLimited::azalea_read_limited(buf, limit)?;
35        Ok(Self { raw, filtered })
36    }
37}
38impl<T: AzBufVar> AzBufVar for Filterable<T> {
39    fn azalea_read_var(buf: &mut Cursor<&[u8]>) -> Result<Self, azalea_buf::BufReadError> {
40        let raw = AzBufVar::azalea_read_var(buf)?;
41        let filtered = AzBufVar::azalea_read_var(buf)?;
42        Ok(Self { raw, filtered })
43    }
44    fn azalea_write_var(&self, buf: &mut impl Write) -> io::Result<()> {
45        self.raw.azalea_write_var(buf)?;
46        self.filtered.azalea_write_var(buf)?;
47        Ok(())
48    }
49}
50
51impl<T: Clone> Clone for Filterable<T> {
52    fn clone(&self) -> Self {
53        Self {
54            raw: self.raw.clone(),
55            filtered: self.filtered.clone(),
56        }
57    }
58}
59impl<T: PartialEq> PartialEq for Filterable<T> {
60    fn eq(&self, other: &Self) -> bool {
61        self.raw == other.raw && self.filtered == other.filtered
62    }
63}
64impl<T: Debug> Debug for Filterable<T> {
65    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
66        f.debug_struct("Filterable")
67            .field("raw", &self.raw)
68            .field("filtered", &self.filtered)
69            .finish()
70    }
71}