RustXMLParseTest/src/oop.rs
Kyle Kiteveles c15d1613b8 Struct methods to &self, related changed to parse.
Cleaned up struct derives, comments, and variables in main.
2023-08-07 15:44:57 -04:00

276 lines
No EOL
6.9 KiB
Rust

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<Genus>,
messages: Vec<Vec<String>>,
}
impl Family {
pub fn new(name: String, genera: Vec<Genus>, messages: Vec<Vec<String>>) -> 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<Genus>{
return &mut self.genera
}
#[allow(unused)]
pub fn get_messages(&self) -> Vec<Vec<String>>{
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<Species>,
}
impl Genus {
pub fn new(name: String, species: Vec<Species>) -> Self {
Self { name, species }
}
pub fn get_name(&self) -> String{
return self.name.clone()
}
pub fn get_species(&mut self) -> &mut Vec<Species>{
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<Object>,
}
impl Species {
pub fn new(name: String, default_value: String, objects: Vec<Object>) -> 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<Object>{
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<ObjectMember>,
}
impl Object {
pub fn new(name: String, abrv: String, version: String, members: Vec<ObjectMember>) -> 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<ObjectMember>{
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<MemberEnumeration>,
}
impl ObjectMember {
pub fn new(member_type: String, name: String, minversion: String, maxversion: String, enumerations: Vec<MemberEnumeration>) -> 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<MemberEnumeration>{
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<String>,
responses: Vec<String>,
commands: Vec<String>,
statuses: Vec<String>,
streams: Vec<String>,
error: String,
}
impl Messages {
pub fn new(requests: Vec<String>, responses: Vec<String>, commands: Vec<String>, statuses: Vec<String>, streams: Vec<String>) -> Self {
Self { requests, responses, commands, statuses, streams, error: String::from("") }
}
#[allow(unused)]
pub fn get_requests(&self) -> Vec<String>{
return self.requests.clone()
}
#[allow(unused)]
pub fn get_responses(&self) -> Vec<String>{
return self.responses.clone()
}
#[allow(unused)]
pub fn get_commands(&self) -> Vec<String>{
return self.commands.clone()
}
#[allow(unused)]
pub fn get_statuses(&self) -> Vec<String>{
return self.statuses.clone()
}
#[allow(unused)]
pub fn get_streams(&self) -> Vec<String>{
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())
}
};
}
}
}
}
}