1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
use std::rc::Rc; use byteorder::{LittleEndian, WriteBytesExt}; use failure::Error; use crate::{ chunks::TOKEN_XML_START_NAMESPACE, model::{owned::OwnedBuf, NamespaceStart, StringTable}, }; #[derive(Debug, Copy, Clone)] pub struct XmlNamespaceStartBuf { line: u32, prefix_index: u32, namespace_index: u32, } impl XmlNamespaceStartBuf { pub fn new(line: u32, prefix_index: u32, namespace_index: u32) -> Self { Self { line, prefix_index, namespace_index, } } } impl NamespaceStart for XmlNamespaceStartBuf { fn get_line(&self) -> Result<u32, Error> { Ok(self.line) } fn get_prefix<S: StringTable>(&self, string_table: &S) -> Result<Rc<String>, Error> { let string = string_table.get_string(self.prefix_index)?; Ok(string) } fn get_namespace<S: StringTable>(&self, string_table: &S) -> Result<Rc<String>, Error> { let string = string_table.get_string(self.namespace_index)?; Ok(string) } } impl OwnedBuf for XmlNamespaceStartBuf { fn get_token(&self) -> u16 { TOKEN_XML_START_NAMESPACE } fn get_body_data(&self) -> Result<Vec<u8>, Error> { let mut out = Vec::new(); out.write_u32::<LittleEndian>(self.prefix_index)?; out.write_u32::<LittleEndian>(self.namespace_index)?; Ok(out) } fn get_header(&self) -> Result<Vec<u8>, Error> { let mut out = Vec::new(); out.write_u32::<LittleEndian>(self.line)?; out.write_u32::<LittleEndian>(0xFFFF_FFFF)?; Ok(out) } } #[cfg(test)] mod tests { use super::{NamespaceStart, OwnedBuf, XmlNamespaceStartBuf}; use crate::{ chunks::XmlNamespaceStartWrapper, raw_chunks::EXAMPLE_NAMESPACE_START, test::{compare_chunks, FakeStringTable}, }; #[test] fn it_can_generate_a_chunk_with_the_given_data() { let fake_string_table = FakeStringTable; let namespace_start = XmlNamespaceStartBuf::new(99, 11, 33); assert_eq!( "Ones", &*namespace_start.get_prefix(&fake_string_table).unwrap() ); assert_eq!( "Threes", &*namespace_start.get_namespace(&fake_string_table).unwrap() ); } #[test] fn identity() { let wrapper = XmlNamespaceStartWrapper::new(EXAMPLE_NAMESPACE_START); let owned = wrapper.to_buffer().unwrap(); let new_raw = owned.to_vec().unwrap(); compare_chunks(&new_raw, &EXAMPLE_NAMESPACE_START); } }