Corrected Record::new().
Some checks failed
MoreThanText/morethantext/pipeline/head There was a failure building this commit
Some checks failed
MoreThanText/morethantext/pipeline/head There was a failure building this commit
This commit is contained in:
parent
a26471088d
commit
a86cbacf7b
@ -25,8 +25,18 @@ pub struct Record {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl Record {
|
impl Record {
|
||||||
pub fn new(data: HashMap<String, Field>) -> Self {
|
pub fn new() -> Self {
|
||||||
Self { data: data }
|
Self {
|
||||||
|
data: HashMap::new(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn add<S, D>(&mut self, name: S, data: D) -> Option<Field>
|
||||||
|
where
|
||||||
|
String: From<S>,
|
||||||
|
Field: From<D>,
|
||||||
|
{
|
||||||
|
self.data.insert(name.into(), data.into())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -56,21 +66,49 @@ mod records {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn new_record() {
|
fn new_record() {
|
||||||
let data: HashMap<String, Field> = HashMap::new();
|
let rec = Record::new();
|
||||||
let rec = Record::new(data);
|
|
||||||
assert_eq!(rec.len(), 0);
|
assert_eq!(rec.len(), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn add_field() {
|
||||||
|
let mut rec = Record::new();
|
||||||
|
let name = "field_name";
|
||||||
|
let data = ID::random();
|
||||||
|
rec.add(name.to_string(), data);
|
||||||
|
match rec.get(name) {
|
||||||
|
Some(data) => match data {
|
||||||
|
Field::ID(result) => assert_eq!(result.to_string(), data.to_string()),
|
||||||
|
},
|
||||||
|
None => unreachable!("Should get data back"),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn add_alternate_field() {
|
||||||
|
let mut rec = Record::new();
|
||||||
|
let name = "alternate";
|
||||||
|
let data = ID::random();
|
||||||
|
rec.add(name, data.clone());
|
||||||
|
match rec.get(name) {
|
||||||
|
Some(data) => match data {
|
||||||
|
Field::ID(result) => assert_eq!(result.to_string(), data.to_string()),
|
||||||
|
},
|
||||||
|
None => unreachable!("Should get data back"),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn record_iter() {
|
fn record_iter() {
|
||||||
let a = Field::from(ID::random());
|
let mut data: HashMap<String, ID> = HashMap::new();
|
||||||
let b = Field::from(ID::random());
|
data.insert("a".to_string(), ID::random());
|
||||||
let c = Field::from(ID::random());
|
data.insert("b".to_string(), ID::random());
|
||||||
let mut data: HashMap<String, Field> = HashMap::new();
|
data.insert("c".to_string(), ID::random());
|
||||||
data.insert("a".to_string(), a.clone());
|
let mut rec = Record::new();
|
||||||
data.insert("b".to_string(), b.clone());
|
for (key, value) in data.iter() {
|
||||||
data.insert("c".to_string(), c.clone());
|
rec.add(key, value.clone());
|
||||||
let rec = Record::new(data.clone());
|
}
|
||||||
|
assert_eq!(rec.len(), data.len());
|
||||||
for (key, value) in rec.iter() {
|
for (key, value) in rec.iter() {
|
||||||
assert_eq!(value.to_string(), data.get(key).unwrap().to_string());
|
assert_eq!(value.to_string(), data.get(key).unwrap().to_string());
|
||||||
}
|
}
|
||||||
|
@ -11,6 +11,7 @@ use std::{collections::HashMap, fmt};
|
|||||||
pub enum TBLError {
|
pub enum TBLError {
|
||||||
DuplicateField(String),
|
DuplicateField(String),
|
||||||
InvalidField(String),
|
InvalidField(String),
|
||||||
|
MissingField(String),
|
||||||
}
|
}
|
||||||
|
|
||||||
impl fmt::Display for TBLError {
|
impl fmt::Display for TBLError {
|
||||||
@ -18,6 +19,7 @@ impl fmt::Display for TBLError {
|
|||||||
match self {
|
match self {
|
||||||
TBLError::DuplicateField(data) => write!(f, "'{}' already exists", data),
|
TBLError::DuplicateField(data) => write!(f, "'{}' already exists", data),
|
||||||
TBLError::InvalidField(data) => write!(f, "'{}' invalid field name", data),
|
TBLError::InvalidField(data) => write!(f, "'{}' invalid field name", data),
|
||||||
|
TBLError::MissingField(data) => write!(f, "'{}' field is missing", data),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -39,6 +41,13 @@ mod errors {
|
|||||||
let err = TBLError::InvalidField(data.to_string());
|
let err = TBLError::InvalidField(data.to_string());
|
||||||
assert_eq!(err.to_string(), format!("'{}' invalid field name", data));
|
assert_eq!(err.to_string(), format!("'{}' invalid field name", data));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn missing_field() {
|
||||||
|
let data = "something";
|
||||||
|
let err = TBLError::MissingField(data.to_string());
|
||||||
|
assert_eq!(err.to_string(), format!("'{}' field is missing", data));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
enum FieldType {
|
enum FieldType {
|
||||||
@ -86,15 +95,22 @@ impl Table {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn add_record(&mut self, rec: Record) -> Result<Record, MTTError> {
|
fn add_record(&mut self, rec: Record) -> Result<Record, MTTError> {
|
||||||
for (key, _) in rec.iter() {
|
let mut holder = rec.clone();
|
||||||
match self.fields.get(key) {
|
for (key, _) in self.fields.iter() {
|
||||||
|
match holder.remove(key.into()) {
|
||||||
Some(_) => {}
|
Some(_) => {}
|
||||||
None => {
|
None => {
|
||||||
let err = TBLError::InvalidField(key.to_string());
|
let err = TBLError::MissingField(key.to_string());
|
||||||
return Err(err.into());
|
return Err(err.into());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if holder.len() > 0 {
|
||||||
|
for (key, _) in holder.iter() {
|
||||||
|
let err = TBLError::InvalidField(key.to_string());
|
||||||
|
return Err(err.into());
|
||||||
|
}
|
||||||
|
}
|
||||||
Ok(rec)
|
Ok(rec)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -134,10 +150,10 @@ mod table {
|
|||||||
match tbl.add_field(name, FieldType::ID) {
|
match tbl.add_field(name, FieldType::ID) {
|
||||||
Ok(_) => unreachable!(" Should not duplicates."),
|
Ok(_) => unreachable!(" Should not duplicates."),
|
||||||
Err(err) => match err.get_code() {
|
Err(err) => match err.get_code() {
|
||||||
ErrorType::TBLErr(data) => {match data {
|
ErrorType::TBLErr(data) => match data {
|
||||||
TBLError::DuplicateField(fname) => assert_eq!(fname, name),
|
TBLError::DuplicateField(fname) => assert_eq!(fname, name),
|
||||||
_ => unreachable!("Should have been a dupluicate field error"),
|
_ => unreachable!("Should have been a dupluicate field error"),
|
||||||
}}
|
},
|
||||||
_ => unreachable!("should produce a duplicate name error"),
|
_ => unreachable!("should produce a duplicate name error"),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
@ -149,9 +165,8 @@ mod table {
|
|||||||
let name = "id";
|
let name = "id";
|
||||||
let field_data = ID::random();
|
let field_data = ID::random();
|
||||||
tbl.add_field(name, FieldType::ID).unwrap();
|
tbl.add_field(name, FieldType::ID).unwrap();
|
||||||
let mut data: HashMap<String, Field> = HashMap::new();
|
let mut rec = Record::new();
|
||||||
data.insert(name.to_string(), field_data.clone().into());
|
rec.add(name, field_data.clone());
|
||||||
let rec = Record::new(data);
|
|
||||||
let result = tbl.add_record(rec).unwrap();
|
let result = tbl.add_record(rec).unwrap();
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
result.get(name).unwrap().to_string(),
|
result.get(name).unwrap().to_string(),
|
||||||
@ -164,9 +179,8 @@ mod table {
|
|||||||
let mut tbl = Table::new();
|
let mut tbl = Table::new();
|
||||||
let name = "id";
|
let name = "id";
|
||||||
let field_data = ID::random();
|
let field_data = ID::random();
|
||||||
let mut data: HashMap<String, Field> = HashMap::new();
|
let mut rec = Record::new();
|
||||||
data.insert(name.to_string(), field_data.clone().into());
|
rec.add(name, field_data.clone());
|
||||||
let rec = Record::new(data);
|
|
||||||
match tbl.add_record(rec) {
|
match tbl.add_record(rec) {
|
||||||
Ok(_) => unreachable!("should have produced an error"),
|
Ok(_) => unreachable!("should have produced an error"),
|
||||||
Err(err) => match err.get_code() {
|
Err(err) => match err.get_code() {
|
||||||
@ -175,7 +189,28 @@ mod table {
|
|||||||
_ => unreachable!("should have been invalid field name"),
|
_ => unreachable!("should have been invalid field name"),
|
||||||
},
|
},
|
||||||
_ => unreachable!("should have been a table error"),
|
_ => unreachable!("should have been a table error"),
|
||||||
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn add_record_missing_field() {
|
||||||
|
let mut tbl = Table::new();
|
||||||
|
let present = "here";
|
||||||
|
let missing = "not";
|
||||||
|
tbl.add_field(present, FieldType::ID);
|
||||||
|
tbl.add_field(missing, FieldType::ID);
|
||||||
|
let mut rec = Record::new();
|
||||||
|
rec.add(present, ID::random());
|
||||||
|
match tbl.add_record(rec) {
|
||||||
|
Ok(_) => unreachable!("should have produced an error"),
|
||||||
|
Err(err) => match err.get_code() {
|
||||||
|
ErrorType::TBLErr(error) => match error {
|
||||||
|
TBLError::MissingField(result) => assert_eq!(result, missing),
|
||||||
|
_ => unreachable!("should have been missing field"),
|
||||||
|
},
|
||||||
|
_ => unreachable!("should have been a table error"),
|
||||||
|
},
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
use crate::data::{id::IDError, DBError, table::TBLError};
|
use crate::data::{id::IDError, table::TBLError, DBError};
|
||||||
use std::{error::Error, fmt};
|
use std::{error::Error, fmt};
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
@ -109,7 +109,6 @@ impl From<TBLError> for MTTError {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod errors {
|
mod errors {
|
||||||
use super::*;
|
use super::*;
|
||||||
|
Loading…
Reference in New Issue
Block a user