use crate::table;
use crate::table::{TableEntry, ToBytes};
use std::collections::HashMap;
pub type IndexType = u32;
#[derive(Debug, Clone)]
pub struct Register {
name: String,
entries: HashMap<IndexType, RegisterEntry>,
}
impl Register {
pub fn new(name: &str, entries: HashMap<IndexType, RegisterEntry>) -> Register {
Register {
name: name.to_owned(),
entries,
}
}
pub fn name(&self) -> &str {
&self.name
}
pub fn entries(&self) -> &HashMap<IndexType, RegisterEntry> {
&self.entries
}
pub fn get(&self, index: IndexType) -> Option<&RegisterEntry> {
self.entries.get(&index)
}
pub fn parse_register_entries(entries: Vec<TableEntry>, name: &str) -> Register {
let mut register_entries: HashMap<IndexType, RegisterEntry> = HashMap::new();
for e in entries {
let index = table::ToBytes::to_u32(
e.match_keys
.get("$REGISTER_INDEX")
.unwrap()
.get_exact_value(),
);
let mut reg_data: HashMap<String, Vec<Vec<u8>>> = HashMap::new();
for data in e.action_data {
let key = data.get_key();
let value = data.get_data();
if reg_data.contains_key(key) {
reg_data.get_mut(key).unwrap().push(value.clone());
} else {
reg_data.insert(key.to_owned(), vec![value.clone()]);
}
}
register_entries.insert(index, RegisterEntry::new(index, reg_data));
}
Register::new(name, register_entries)
}
}
#[derive(Debug, Clone)]
pub struct RegisterEntry {
index: IndexType,
data: HashMap<String, Vec<Vec<u8>>>,
}
impl RegisterEntry {
pub(crate) fn new(index: IndexType, data: HashMap<String, Vec<Vec<u8>>>) -> RegisterEntry {
RegisterEntry { index, data }
}
pub fn get_index(&self) -> IndexType {
self.index
}
pub fn get_data(&self) -> &HashMap<String, Vec<Vec<u8>>> {
&self.data
}
pub fn get(&self, name: &str) -> Option<&Vec<Vec<u8>>> {
self.data.get(name)
}
}
#[derive(Debug, Clone)]
pub struct Request {
name: String,
index: Option<IndexType>,
data: HashMap<String, Vec<u8>>,
}
impl Request {
pub fn new(name: &str) -> Request {
Request {
name: name.to_owned(),
index: None,
data: HashMap::new(),
}
}
pub fn index(self, index: IndexType) -> Request {
Request {
index: Some(index),
..self
}
}
pub fn get_name(&self) -> &str {
&self.name
}
pub fn get_index(&self) -> &Option<IndexType> {
&self.index
}
pub fn data<T: ToBytes>(mut self, name: &str, value: T) -> Request {
self.data.insert(name.to_owned(), value.to_bytes());
self
}
pub fn get_data(&self) -> &HashMap<String, Vec<u8>> {
&self.data
}
}