Got add records functioning.
This commit is contained in:
parent
ca40b8495c
commit
54fbfa7f9c
92
src/lib.rs
92
src/lib.rs
@ -17,6 +17,7 @@ use std::{
|
|||||||
|
|
||||||
struct Request;
|
struct Request;
|
||||||
|
|
||||||
|
#[derive(Clone)]
|
||||||
enum Field {
|
enum Field {
|
||||||
Static(String),
|
Static(String),
|
||||||
}
|
}
|
||||||
@ -136,17 +137,52 @@ mod records {
|
|||||||
|
|
||||||
struct Response {
|
struct Response {
|
||||||
data: HashMap<String, Vec<Field>>,
|
data: HashMap<String, Vec<Field>>,
|
||||||
|
counter: usize,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Response {
|
impl Response {
|
||||||
fn new() -> Self {
|
fn new() -> Self {
|
||||||
Self {
|
Self {
|
||||||
data: HashMap::new(),
|
data: HashMap::new(),
|
||||||
|
counter: 0,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn count(&self) -> usize {
|
fn add(&mut self, rec: Record) -> Result<(), String> {
|
||||||
0
|
if self.data.is_empty() {
|
||||||
|
for (key, value) in rec.iter() {
|
||||||
|
let mut store = Vec::new();
|
||||||
|
store.push(value.clone());
|
||||||
|
self.data.insert(key.to_string(), store);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (key, value) in rec.iter() {
|
||||||
|
match self.data.get_mut(key) {
|
||||||
|
Some(data) => data.push(value.clone()),
|
||||||
|
None => return Err("bad".to_string()),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Iterator for Response {
|
||||||
|
type Item = Record;
|
||||||
|
|
||||||
|
fn next(&mut self) -> Option<Self::Item> {
|
||||||
|
if self.data.is_empty() {
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
let mut rec = Record::new();
|
||||||
|
for (key, value) in self.data.iter() {
|
||||||
|
if self.counter >= value.len() {
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
rec.add(key, value[self.counter].clone());
|
||||||
|
}
|
||||||
|
self.counter += 1;
|
||||||
|
Some(rec)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -156,9 +192,57 @@ mod responses {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn create_response() {
|
fn create_response() {
|
||||||
let res = Response::new();
|
let mut res = Response::new();
|
||||||
assert!(res.data.is_empty());
|
assert!(res.data.is_empty());
|
||||||
assert_eq!(res.count(), 0);
|
assert!(res.next().is_none());
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn add_records() {
|
||||||
|
let mut res = Response::new();
|
||||||
|
let columns = ["col1", "col2"];
|
||||||
|
let count = 3;
|
||||||
|
let field_cnt = &count * columns.len();
|
||||||
|
let mut fields = 0..field_cnt;
|
||||||
|
for _ in 0..count {
|
||||||
|
let mut rec = Record::new();
|
||||||
|
for col in columns {
|
||||||
|
rec.add(col, fields.next().unwrap().to_string());
|
||||||
|
}
|
||||||
|
res.add(rec);
|
||||||
|
}
|
||||||
|
fields = 0..field_cnt;
|
||||||
|
for _ in 0..count {
|
||||||
|
match res.next() {
|
||||||
|
Some(rec) => {
|
||||||
|
assert_eq!(rec.len(), columns.len());
|
||||||
|
for col in columns {
|
||||||
|
match rec.get(col).unwrap() {
|
||||||
|
Field::Static(txt) => {
|
||||||
|
assert_eq!(txt.clone(), fields.next().unwrap().to_string())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
None => unreachable!("Should have returned data"),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
assert!(res.next().is_none(), "exceeded the correct of records");
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn number_of_columns_mismatch() {
|
||||||
|
let mut res = Response::new();
|
||||||
|
let mut rec1 = Record::new();
|
||||||
|
let mut rec2 = Record::new();
|
||||||
|
rec1.add("one", "one");
|
||||||
|
rec2.add("one", "one");
|
||||||
|
rec2.add("two", "two");
|
||||||
|
res.add(rec1).unwrap();
|
||||||
|
match res.add(rec2) {
|
||||||
|
Ok(_) => unreachable!("Should not accept additional value"),
|
||||||
|
Err(_) => {}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user