use phf::phf_ordered_map; use crate::roxmltree::Node; const MESSAGETYPE: phf::OrderedMap<&'static str, &'static str> = phf_ordered_map! { "Request" => "requests", "Response" => "responses", "Command" => "commands", "Status" => "statuses", "Stream" => "streams", }; #[derive(Debug, Clone)] pub struct Family { name: String, genera: Vec, messages: Vec>, } impl Family { pub fn new(name: String, genera: Vec, messages: Vec>) -> Self { Self { name, genera, messages } } pub fn get_name(&self) -> String{ return self.name.clone() } /*pub fn set_name(&mut self, name: String){ if self.name.len() == 0 { self.name = name } }*/ pub fn get_genera(&mut self) -> &mut Vec{ return &mut self.genera } #[allow(unused)] pub fn get_messages(&self) -> Vec>{ return self.messages.clone() } pub fn push_genus(&mut self, genus: Genus) { self.genera.push(genus); } pub fn push_messages(&mut self, messages: Messages) { self.messages.push(messages.requests); self.messages.push(messages.responses); self.messages.push(messages.commands); self.messages.push(messages.statuses); self.messages.push(messages.streams); } } #[derive(Debug, Clone)] pub struct Genus { name: String, species: Vec, } impl Genus { pub fn new(name: String, species: Vec) -> Self { Self { name, species } } pub fn get_name(&self) -> String{ return self.name.clone() } pub fn get_species(&mut self) -> &mut Vec{ return &mut self.species } pub fn push_species(&mut self, species: Species) { self.species.push(species); } } #[derive(Debug, Clone)] pub struct Species { name: String, default_value: String, objects: Vec, } impl Species { pub fn new(name: String, default_value: String, objects: Vec) -> Self { Self { name, default_value, objects } } pub fn get_name(&self) -> String{ return self.name.clone() } #[allow(unused)] pub fn get_default_value(&self) -> String{ return self.default_value.clone() } pub fn get_objects(&mut self) -> &mut Vec{ return &mut self.objects } pub fn push_object(&mut self, object: Object) { self.objects.push(object); } } #[derive(Debug, Clone)] pub struct Object { name: String, abrv: String, version: String, members: Vec, } impl Object { pub fn new(name: String, abrv: String, version: String, members: Vec) -> Self { Self { name, abrv, version, members } } #[allow(unused)] pub fn get_name(&self) -> String{ return self.name.clone() } #[allow(unused)] pub fn get_abrv(&self) -> String{ return self.abrv.clone() } #[allow(unused)] pub fn get_version(&self) -> String{ return self.version.clone() } #[allow(unused)] pub fn get_members(&mut self) -> &mut Vec{ return &mut self.members } pub fn push_object_member(&mut self, member: ObjectMember) { self.members.push(member); } } #[derive(Debug, Clone)] pub struct ObjectMember { member_type: String, name: String, minversion: String, maxversion: String, enumerations: Vec, } impl ObjectMember { pub fn new(member_type: String, name: String, minversion: String, maxversion: String, enumerations: Vec) -> Self { Self { member_type, name, minversion, maxversion, enumerations } } pub fn get_name(&self) -> String{ return self.name.clone() } #[allow(unused)] pub fn get_member_type(&self) -> String{ return self.member_type.clone() } #[allow(unused)] pub fn get_minversion(&self) -> String{ return self.minversion.clone() } #[allow(unused)] pub fn get_maxversion(&self) -> String{ return self.maxversion.clone() } #[allow(unused)] pub fn get_enumerations(&mut self) -> &mut Vec{ return &mut self.enumerations } #[allow(unused)] pub fn push_member_enumeration(&mut self, enumeration: MemberEnumeration) { self.enumerations.push(enumeration); } } #[derive(Debug, Clone)] pub struct MemberEnumeration { name: String, default_value: String, } impl MemberEnumeration { pub fn new(name: String, default_value: String) -> Self { Self { name, default_value } } #[allow(unused)] pub fn get_name(&self) -> String{ return self.name.clone() } #[allow(unused)] pub fn get_default_value(&self) -> String{ return self.default_value.clone() } } #[derive(Debug)] pub struct Messages { requests: Vec, responses: Vec, commands: Vec, statuses: Vec, streams: Vec, error: String, } impl Messages { pub fn new(requests: Vec, responses: Vec, commands: Vec, statuses: Vec, streams: Vec) -> Self { Self { requests, responses, commands, statuses, streams, error: String::from("") } } #[allow(unused)] pub fn get_requests(&self) -> Vec{ return self.requests.clone() } #[allow(unused)] pub fn get_responses(&self) -> Vec{ return self.responses.clone() } #[allow(unused)] pub fn get_commands(&self) -> Vec{ return self.commands.clone() } #[allow(unused)] pub fn get_statuses(&self) -> Vec{ return self.statuses.clone() } #[allow(unused)] pub fn get_streams(&self) -> Vec{ return self.streams.clone() } pub fn push(&mut self, message: Node<'_, '_>) { if let Some(t) = message.attribute_node("type") { let message_type = t.value(); if MESSAGETYPE.contains_key(message_type) { if let Some(n) = message.attribute_node("name") { let message_name = n.value(); match MESSAGETYPE.get_index(message_type).unwrap().to_string().as_str() { "0" => self.requests.push(message_name.to_string()), "1" => self.responses.push(message_name.to_string()), "2" => self.commands.push(message_name.to_string()), "3" => self.statuses.push(message_name.to_string()), "4" => self.streams.push(message_name.to_string()), _ => { let error_position = format!("{}{}", "Error: Unrecognized message type at position ", n.position().to_string().as_str()); self.error.insert_str(0, error_position.as_str()) } }; } } } } }