azalea_core/
filterable.rs1use std::{
2 fmt::Debug,
3 io::{self, Cursor, Write},
4};
5
6use azalea_buf::{AzaleaRead, AzaleaReadLimited, AzaleaReadVar, AzaleaWrite};
7use serde::Serialize;
8
9#[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}