azalea_core/
filterable.rs

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