diff options
| author | Max Audron <audron@cocaine.farm> | 2022-10-06 13:25:55 +0200 |
|---|---|---|
| committer | Max Audron <audron@cocaine.farm> | 2022-10-06 13:27:16 +0200 |
| commit | 45a9f5c3965817536a8c14767de38a39a61ef498 (patch) | |
| tree | ac36bd9655b996f5a2e01d29fe2ee46a7f9ba56e /src/primitive | |
| parent | fix IgnoreListManager (diff) | |
add variant impl for char
Diffstat (limited to 'src/primitive')
| -rw-r--r-- | src/primitive/string.rs | 21 | ||||
| -rw-r--r-- | src/primitive/variant.rs | 22 |
2 files changed, 41 insertions, 2 deletions
diff --git a/src/primitive/string.rs b/src/primitive/string.rs index 478bc0a..5addff2 100644 --- a/src/primitive/string.rs +++ b/src/primitive/string.rs @@ -7,8 +7,25 @@ use failure::Error; use log::trace; -use crate::util; -use crate::{deserialize::*, serialize::*}; +use crate::{deserialize::*, error::ProtocolError, serialize::*, util}; + +impl Deserialize for char { + fn parse(b: &[u8]) -> Result<(usize, Self), Error> { + let (slen, qchar): (usize, u16) = u16::parse(&b[0..2])?; + let qchar = char::from_u32(qchar as u32).ok_or(ProtocolError::CharError)?; + + return Ok((slen, qchar)); + } +} + +impl Serialize for char { + fn serialize(&self) -> Result<Vec<u8>, Error> { + let mut b = [0, 0]; + self.encode_utf16(&mut b); + + return Ok(b[0].to_be_bytes().to_vec()); + } +} /// We Shadow the String type here as we can only use impl on types in our own scope. /// diff --git a/src/primitive/variant.rs b/src/primitive/variant.rs index 3b41b7b..833df25 100644 --- a/src/primitive/variant.rs +++ b/src/primitive/variant.rs @@ -40,6 +40,7 @@ pub enum Variant { #[from(ignore)] ByteArray(String), StringList(StringList), + char(char), bool(bool), u64(u64), u32(u32), @@ -204,6 +205,11 @@ impl Serialize for Variant { res.extend(unknown.to_be_bytes().iter()); res.extend(v.serialize()?.iter()); } + Variant::char(v) => { + res.extend(primitive::QCHAR.to_be_bytes().iter()); + res.extend(unknown.to_be_bytes().iter()); + res.extend(v.serialize()?.iter()); + } Variant::String(v) => { res.extend(primitive::QSTRING.to_be_bytes().iter()); res.extend(unknown.to_be_bytes().iter()); @@ -304,6 +310,7 @@ impl Serialize for Variant { impl Deserialize for Variant { fn parse(b: &[u8]) -> Result<(usize, Self), Error> { + trace!("trying to parse variant with bytes: {:?}", b); let (_, qtype) = i32::parse(&b[0..4])?; let qtype = qtype as u32; @@ -322,6 +329,11 @@ impl Deserialize for Variant { let (vlen, value) = VariantList::parse(&b[len..])?; return Ok((len + vlen, Variant::VariantList(value))); } + primitive::QCHAR => { + trace!(target: "primitive::Variant", "Parsing Variant: Char"); + let (vlen, value) = char::parse(&b[len..])?; + return Ok((len + vlen, Variant::char(value))); + } primitive::QSTRING => { trace!(target: "primitive::Variant", "Parsing Variant: String"); let (vlen, value) = String::parse(&b[len..])?; @@ -655,6 +667,16 @@ mod tests { } #[test] + fn char_serialize() { + assert_eq!(Variant::char('z').serialize().unwrap(), [0, 0, 0, 7, 0, 0, 122]); + } + + #[test] + fn char_deserialize() { + assert_eq!((7, Variant::char('z')), Variant::parse(&[0, 0, 0, 7, 0, 0, 122]).unwrap()); + } + + #[test] fn strings_serialize() { let test_string = "This is a Test!1!!".to_string(); let test_string_list = vec!["test1".to_string(), "test 2".to_string()]; |
