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