azalea_core/
filterable.rs1use std::{
2 fmt::Debug,
3 io::{self, Cursor, Write},
4};
5
6use azalea_buf::{AzBuf, AzBufLimited, AzBufVar};
7
8#[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}