diff --git a/src/lib.rs b/src/lib.rs index a34c5c3..c0d3e2b 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,6 +1,9 @@ +#![feature(const_generics)] + pub mod crypto; pub mod packet; pub mod character; +pub mod util; use std::io::Read; #[derive(Debug, PartialEq)] diff --git a/src/util.rs b/src/util.rs new file mode 100644 index 0000000..884ab1a --- /dev/null +++ b/src/util.rs @@ -0,0 +1,63 @@ + +pub fn array_to_utf8(array: [u8; X]) -> Result { + String::from_utf8(array.to_vec()) + .map(|mut s| { + if let Some(index) = s.find("\u{0}") { + s.truncate(index); + } + s + }) +} + + +// TODO: const fn version of this! (helpful with tests) +#[macro_export] +macro_rules! utf8_to_array { + ($s: expr, $size: expr) => { + { + let mut array = [0u8; $size]; + let bytes = $s.as_bytes(); + array[..bytes.len()].clone_from_slice(&bytes); + array + } + } +} + +#[macro_export] +macro_rules! utf8_to_utf16_array { + ($s: expr, $size: expr) => { + { + let mut array = [0u16; $size]; + //let bytes = $s.as_bytes(); + let bytes = $s.encode_utf16().collect::>(); + array[..bytes.len()].clone_from_slice(&bytes); + array + } + } +} + + +#[cfg(test)] +mod test { + #[test] + fn test_utf8_to_array() { + let s = "asdf".to_owned(); + let a = utf8_to_array!(s, 8); + + let mut e = [0u8; 8]; + e[..4].clone_from_slice(b"asdf"); + assert!(a == e); + } + + #[test] + fn utf8_to_utf16_array() { + let utf16 = utf8_to_utf16_array!("asdf", 16); + assert!(utf16 == [97, 115, 100, 102, 0,0,0,0,0,0,0,0,0,0,0,0]) + } + + #[test] + fn utf8_to_utf16_array_unicode() { + let utf16 = utf8_to_utf16_array!("あいうえお", 16); + assert!(utf16 == [0x3042 , 0x3044, 0x3046, 0x3048, 0x304A, 0,0,0,0,0,0,0,0,0,0,0]) + } +}