hickory_proto/rr/rdata/
null.rs1use std::fmt;
10
11#[cfg(feature = "serde-config")]
12use serde::{Deserialize, Serialize};
13
14use crate::{
15 error::ProtoResult,
16 rr::{RData, RecordData, RecordDataDecodable, RecordType},
17 serialize::binary::{BinDecoder, BinEncodable, BinEncoder, Restrict},
18};
19
20#[cfg_attr(feature = "serde-config", derive(Deserialize, Serialize))]
38#[derive(Default, Debug, PartialEq, Eq, Hash, Clone)]
39pub struct NULL {
40 anything: Vec<u8>,
41}
42
43impl NULL {
44 pub const fn new() -> Self {
46 Self {
47 anything: Vec::new(),
48 }
49 }
50
51 pub fn with(anything: Vec<u8>) -> Self {
53 debug_assert!(!anything.is_empty());
55
56 Self { anything }
57 }
58
59 pub fn anything(&self) -> &[u8] {
61 &self.anything
62 }
63}
64
65impl BinEncodable for NULL {
66 fn emit(&self, encoder: &mut BinEncoder<'_>) -> ProtoResult<()> {
67 for b in self.anything() {
68 encoder.emit(*b)?;
69 }
70
71 Ok(())
72 }
73}
74
75impl<'r> RecordDataDecodable<'r> for NULL {
76 fn read_data(decoder: &mut BinDecoder<'r>, length: Restrict<u16>) -> ProtoResult<Self> {
77 let rdata_length = length.map(|u| u as usize).unverified();
78 if rdata_length > 0 {
79 let anything = decoder.read_vec(rdata_length)?.unverified();
80 Ok(Self::with(anything))
81 } else {
82 Ok(Self::new())
83 }
84 }
85}
86
87impl RecordData for NULL {
88 fn try_from_rdata(data: RData) -> Result<Self, RData> {
89 match data {
90 RData::NULL(csync) => Ok(csync),
91 _ => Err(data),
92 }
93 }
94
95 fn try_borrow(data: &RData) -> Option<&Self> {
96 match data {
97 RData::NULL(csync) => Some(csync),
98 _ => None,
99 }
100 }
101
102 fn record_type(&self) -> RecordType {
103 RecordType::NULL
104 }
105
106 fn into_rdata(self) -> RData {
107 RData::NULL(self)
108 }
109}
110
111impl fmt::Display for NULL {
112 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> Result<(), fmt::Error> {
113 f.write_str(&data_encoding::BASE64.encode(&self.anything))
114 }
115}
116
117#[cfg(test)]
118mod tests {
119 #![allow(clippy::dbg_macro, clippy::print_stdout)]
120
121 use super::*;
122
123 #[test]
124 fn test() {
125 let rdata = NULL::with(vec![0, 1, 2, 3, 4, 5, 6, 7]);
126
127 let mut bytes = Vec::new();
128 let mut encoder: BinEncoder<'_> = BinEncoder::new(&mut bytes);
129 assert!(rdata.emit(&mut encoder).is_ok());
130 let bytes = encoder.into_bytes();
131
132 println!("bytes: {bytes:?}");
133
134 let mut decoder: BinDecoder<'_> = BinDecoder::new(bytes);
135 let restrict = Restrict::new(bytes.len() as u16);
136 let read_rdata = NULL::read_data(&mut decoder, restrict).expect("Decoding error");
137 assert_eq!(rdata, read_rdata);
138 }
139}