Added FileData trait to Databases.
This commit is contained in:
parent
878e5277bf
commit
6e6de135ef
@ -1,4 +1,5 @@
|
|||||||
use std::collections::HashMap;
|
use super::{DBError, FileData};
|
||||||
|
use std::{collections::HashMap, slice, str};
|
||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
pub struct Databases {
|
pub struct Databases {
|
||||||
@ -32,6 +33,54 @@ impl Databases {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl FileData<Self> for Databases {
|
||||||
|
fn to_bytes(&self) -> Vec<u8> {
|
||||||
|
let mut output = Vec::new();
|
||||||
|
for (name, id) in self.db_map.iter() {
|
||||||
|
output.append(&mut name.as_bytes().to_vec());
|
||||||
|
output.push(0);
|
||||||
|
output.append(&mut id.as_bytes().to_vec());
|
||||||
|
output.push(0);
|
||||||
|
}
|
||||||
|
output
|
||||||
|
}
|
||||||
|
|
||||||
|
fn from_bytes(data: &mut slice::Iter<u8>) -> Result<Self, DBError> {
|
||||||
|
let mut output = Databases::new();
|
||||||
|
let mut name: Vec<u8> = Vec::new();
|
||||||
|
let mut id: Vec<u8> = Vec::new();
|
||||||
|
let mut get_id = false;
|
||||||
|
let mut letter: u8;
|
||||||
|
loop {
|
||||||
|
match data.next() {
|
||||||
|
Some(a) => letter = a.clone(),
|
||||||
|
None => {
|
||||||
|
if !name.is_empty() {
|
||||||
|
return Err(DBError::new("file corruption"));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if letter == 0 {
|
||||||
|
if get_id {
|
||||||
|
output
|
||||||
|
.add_database(str::from_utf8(&name).unwrap(), str::from_utf8(&id).unwrap());
|
||||||
|
name.clear();
|
||||||
|
id.clear();
|
||||||
|
}
|
||||||
|
get_id = !get_id;
|
||||||
|
} else {
|
||||||
|
if get_id {
|
||||||
|
id.push(letter);
|
||||||
|
} else {
|
||||||
|
name.push(letter);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Ok(output)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod functions {
|
mod functions {
|
||||||
use super::*;
|
use super::*;
|
||||||
@ -79,3 +128,65 @@ mod functions {
|
|||||||
assert_eq!(output, expected);
|
assert_eq!(output, expected);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod filedata {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn to_bytes_new() {
|
||||||
|
let dbs = Databases::new();
|
||||||
|
let expected: Vec<u8> = Vec::new();
|
||||||
|
let output = dbs.to_bytes();
|
||||||
|
assert_eq!(output, expected);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn to_bytes_with_database() {
|
||||||
|
let mut dbs = Databases::new();
|
||||||
|
let name = "something";
|
||||||
|
let id = "id";
|
||||||
|
dbs.add_database(name, id);
|
||||||
|
let mut expected: Vec<u8> = Vec::new();
|
||||||
|
expected.append(&mut name.as_bytes().to_vec());
|
||||||
|
expected.push(0);
|
||||||
|
expected.append(&mut id.as_bytes().to_vec());
|
||||||
|
expected.push(0);
|
||||||
|
let output = dbs.to_bytes();
|
||||||
|
assert_eq!(output, expected);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn from_bytes() {
|
||||||
|
let mut dbs = Databases::new();
|
||||||
|
dbs.add_database("one", "1");
|
||||||
|
dbs.add_database("two", "2");
|
||||||
|
dbs.add_database("three", "3");
|
||||||
|
let data = dbs.to_bytes();
|
||||||
|
let mut feed = data.iter();
|
||||||
|
let output = Databases::from_bytes(&mut feed).unwrap();
|
||||||
|
assert_eq!(output.db_map, dbs.db_map);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn from_bytes_incomplete_name() {
|
||||||
|
let data = "notName".as_bytes();
|
||||||
|
let mut feed = data.iter();
|
||||||
|
match Databases::from_bytes(&mut feed) {
|
||||||
|
Ok(_) => assert!(false, "This should have failed."),
|
||||||
|
Err(err) => assert_eq!(err.to_string(), "file corruption"),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn from_bytes_incomplete_id() {
|
||||||
|
let mut data = "proper".as_bytes().to_vec();
|
||||||
|
data.push(0);
|
||||||
|
data.append(&mut "nope".as_bytes().to_vec());
|
||||||
|
let mut feed = data.iter();
|
||||||
|
match Databases::from_bytes(&mut feed) {
|
||||||
|
Ok(_) => assert!(false, "This should have failed."),
|
||||||
|
Err(err) => assert_eq!(err.to_string(), "file corruption"),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -12,13 +12,18 @@ use error::DBError;
|
|||||||
use rand::{distributions::Alphanumeric, thread_rng, Rng};
|
use rand::{distributions::Alphanumeric, thread_rng, Rng};
|
||||||
use std::{
|
use std::{
|
||||||
collections::HashMap,
|
collections::HashMap,
|
||||||
fmt, str,
|
fmt, slice, str,
|
||||||
time::{Duration, Instant},
|
time::{Duration, Instant},
|
||||||
};
|
};
|
||||||
|
|
||||||
const DATA: &str = "data";
|
const DATA: &str = "data";
|
||||||
const ENTRY: &str = "databases";
|
const ENTRY: &str = "databases";
|
||||||
|
|
||||||
|
trait FileData<F> {
|
||||||
|
fn to_bytes(&self) -> Vec<u8>;
|
||||||
|
fn from_bytes(data: &mut slice::Iter<u8>) -> Result<F, DBError>;
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
pub enum CacheType {
|
pub enum CacheType {
|
||||||
Raw(String),
|
Raw(String),
|
||||||
|
Loading…
Reference in New Issue
Block a user