Adding putting a database into a store.
This commit is contained in:
parent
90ab5809b1
commit
0f8670f686
@ -11,8 +11,11 @@ const ENTRY: &str = "EntryPoint";
|
|||||||
enum ErrorCode {
|
enum ErrorCode {
|
||||||
// General
|
// General
|
||||||
Undefined(String),
|
Undefined(String),
|
||||||
// Cache Entry
|
// Cache
|
||||||
EntryNotFound(String),
|
EntryNotFound(String),
|
||||||
|
InvalidCommitData,
|
||||||
|
// Store
|
||||||
|
DatabaseAlreadyExists(String),
|
||||||
}
|
}
|
||||||
|
|
||||||
impl fmt::Display for ErrorCode {
|
impl fmt::Display for ErrorCode {
|
||||||
@ -20,6 +23,10 @@ impl fmt::Display for ErrorCode {
|
|||||||
match self {
|
match self {
|
||||||
ErrorCode::Undefined(msg) => write!(f, "{}", msg),
|
ErrorCode::Undefined(msg) => write!(f, "{}", msg),
|
||||||
ErrorCode::EntryNotFound(id) => write!(f, "entry '{}' was not found", id),
|
ErrorCode::EntryNotFound(id) => write!(f, "entry '{}' was not found", id),
|
||||||
|
ErrorCode::InvalidCommitData => write!(f, "commit data was not a database store"),
|
||||||
|
ErrorCode::DatabaseAlreadyExists(name) => {
|
||||||
|
write!(f, "database '{}' already exists", name)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -44,6 +51,23 @@ mod errorcodes {
|
|||||||
assert_eq!(err.to_string(), format!("entry '{}' was not found", item));
|
assert_eq!(err.to_string(), format!("entry '{}' was not found", item));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn invalid_commit_data() {
|
||||||
|
let err = ErrorCode::InvalidCommitData;
|
||||||
|
assert_eq!(err.to_string(), "commit data was not a database store");
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn database_already_exists() {
|
||||||
|
for item in ITEMS {
|
||||||
|
let err = ErrorCode::DatabaseAlreadyExists(item.to_string());
|
||||||
|
assert_eq!(
|
||||||
|
err.to_string(),
|
||||||
|
format!("database '{}' already exists", item)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
@ -117,11 +141,109 @@ mod errors {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
struct Store;
|
struct Storage {
|
||||||
|
id: Option<String>,
|
||||||
|
data: Option<DataType>,
|
||||||
|
// delete: bool,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Storage {
|
||||||
|
fn from_id<S>(id: S) -> Self
|
||||||
|
where
|
||||||
|
S: Into<String>,
|
||||||
|
{
|
||||||
|
Self {
|
||||||
|
id: Some(id.into()),
|
||||||
|
data: None,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn from_datatype(dt: DataType) -> Self {
|
||||||
|
Self {
|
||||||
|
id: None,
|
||||||
|
data: Some(dt),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod storage {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn from_id_with_str() {
|
||||||
|
let ids = ["first", "second"];
|
||||||
|
for id in ids {
|
||||||
|
let output = Storage::from_id(id);
|
||||||
|
assert_eq!(output.id, Some(id.to_string()));
|
||||||
|
assert!(
|
||||||
|
output.data.is_none(),
|
||||||
|
"The storage data should have been Non."
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn from_id_with_string() {
|
||||||
|
let id = "my_id".to_string();
|
||||||
|
let output = Storage::from_id(id.clone());
|
||||||
|
assert_eq!(output.id, Some(id));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn from_store() {
|
||||||
|
let output = Storage::from_datatype(DataType::new("store"));
|
||||||
|
assert!(output.id.is_none(), "id should be None.");
|
||||||
|
assert!(output.data.is_some(), "There should be data");
|
||||||
|
let result = output.data.unwrap();
|
||||||
|
match result {
|
||||||
|
DataType::DBMap(_) => (),
|
||||||
|
_ => assert!(false, "{:?} should have been DataType::DBMap.", result),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn from_database() {
|
||||||
|
let output = Storage::from_datatype(DataType::new("database"));
|
||||||
|
let result = output.data.unwrap();
|
||||||
|
match result {
|
||||||
|
DataType::TableMap(_) => (),
|
||||||
|
_ => assert!(false, "{:?} should have been DataType::TableMap.", result),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Debug)]
|
||||||
|
struct Store {
|
||||||
|
data: HashMap<String, Storage>,
|
||||||
|
}
|
||||||
|
|
||||||
impl Store {
|
impl Store {
|
||||||
fn new() -> Self {
|
fn new() -> Self {
|
||||||
Self {}
|
Self {
|
||||||
|
data: HashMap::new(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn add_new<S>(&mut self, name: S) -> Result<(), MTTError>
|
||||||
|
where
|
||||||
|
S: Into<String>,
|
||||||
|
{
|
||||||
|
let dbname = name.into();
|
||||||
|
match self.get(&dbname) {
|
||||||
|
Some(_) => Err(MTTError::from_code(ErrorCode::DatabaseAlreadyExists(
|
||||||
|
dbname,
|
||||||
|
))),
|
||||||
|
None => {
|
||||||
|
self.data
|
||||||
|
.insert(dbname, Storage::from_datatype(DataType::new("database")));
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get(&self, name: &str) -> Option<&Storage> {
|
||||||
|
self.data.get(name)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -130,8 +252,68 @@ mod stores {
|
|||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn create() {
|
fn get_no_database() -> Result<(), MTTError> {
|
||||||
Store::new();
|
let store = Store::new();
|
||||||
|
match store.get("missing_name") {
|
||||||
|
Some(_) => Err(MTTError::new("should have returned None")),
|
||||||
|
None => Ok(()),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn add_database_str() {
|
||||||
|
let mut store = Store::new();
|
||||||
|
let names = ["first", "second"];
|
||||||
|
for name in names {
|
||||||
|
store.add_new(name).unwrap();
|
||||||
|
let output = store.get(name).unwrap();
|
||||||
|
assert!(output.data.is_some(), "There should be a data type.");
|
||||||
|
match output.data.clone().unwrap() {
|
||||||
|
DataType::TableMap(_) => (),
|
||||||
|
_ => assert!(
|
||||||
|
false,
|
||||||
|
"{:?} should have been DataType::TableMap.",
|
||||||
|
output.data
|
||||||
|
),
|
||||||
|
}
|
||||||
|
assert!(output.id.is_none(), "Should not have an id.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn add_database_string() {
|
||||||
|
let mut store = Store::new();
|
||||||
|
let name = "third".to_string();
|
||||||
|
store.add_new(name.clone()).unwrap();
|
||||||
|
let output = store.get(&name).unwrap();
|
||||||
|
match output.data.clone().unwrap() {
|
||||||
|
DataType::TableMap(_) => (),
|
||||||
|
_ => assert!(
|
||||||
|
false,
|
||||||
|
"{:?} should have been DataType::TableMap.",
|
||||||
|
output.data
|
||||||
|
),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn no_duplicate_database_names() -> Result<(), MTTError> {
|
||||||
|
let mut store = Store::new();
|
||||||
|
let name = "duplicate";
|
||||||
|
store.add_new(name).unwrap();
|
||||||
|
match store.add_new(name) {
|
||||||
|
Ok(_) => Err(MTTError::new("should have been an error")),
|
||||||
|
Err(err) => match err.code {
|
||||||
|
ErrorCode::DatabaseAlreadyExists(dbname) => {
|
||||||
|
assert_eq!(dbname, name);
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
_ => Err(MTTError::new(format!(
|
||||||
|
"{:?} should have been DatabaseAlreadyExists.",
|
||||||
|
err.code
|
||||||
|
))),
|
||||||
|
},
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -207,11 +389,19 @@ struct CacheQuery {
|
|||||||
|
|
||||||
struct CacheCommit {
|
struct CacheCommit {
|
||||||
reply: Sender<FromCache>,
|
reply: Sender<FromCache>,
|
||||||
|
// data: DataType,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl CacheCommit {
|
impl CacheCommit {
|
||||||
fn new(channel: Sender<FromCache>) -> Self {
|
fn new(data: DataType, channel: Sender<FromCache>) -> Result<Self, MTTError> {
|
||||||
Self { reply: channel }
|
match data {
|
||||||
|
DataType::DBMap(_) => (),
|
||||||
|
_ => return Err(MTTError::from_code(ErrorCode::InvalidCommitData)),
|
||||||
|
}
|
||||||
|
Ok(Self {
|
||||||
|
// data: data,
|
||||||
|
reply: channel,
|
||||||
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -219,9 +409,27 @@ mod commits {
|
|||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn create() {
|
fn create() -> Result<(), MTTError> {
|
||||||
let (s, _) = unbounded();
|
let (s, _) = unbounded();
|
||||||
CacheCommit::new(s);
|
match CacheCommit::new(DataType::new("store"), s) {
|
||||||
|
Ok(_) => Ok(()),
|
||||||
|
Err(err) => Err(err),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn bad_data_type() -> Result<(), MTTError> {
|
||||||
|
let (s, _) = unbounded();
|
||||||
|
match CacheCommit::new(DataType::new("database"), s) {
|
||||||
|
Ok(_) => Err(MTTError::new("CacheCommit::new did not return error")),
|
||||||
|
Err(err) => match err.code {
|
||||||
|
ErrorCode::InvalidCommitData => Ok(()),
|
||||||
|
_ => Err(MTTError::new(format!(
|
||||||
|
"{:?} is not the correct error",
|
||||||
|
err.code
|
||||||
|
))),
|
||||||
|
},
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -363,7 +571,7 @@ mod caches {
|
|||||||
let dir = tempdir().unwrap();
|
let dir = tempdir().unwrap();
|
||||||
let s_cache = start_cache(dir.path()).await;
|
let s_cache = start_cache(dir.path()).await;
|
||||||
let (s, r) = unbounded();
|
let (s, r) = unbounded();
|
||||||
let msg = ToCache::Commit(CacheCommit::new(s));
|
let msg = ToCache::Commit(CacheCommit::new(DataType::new("store"), s).unwrap());
|
||||||
s_cache.send(msg).await.unwrap();
|
s_cache.send(msg).await.unwrap();
|
||||||
let result = r.recv().await.unwrap();
|
let result = r.recv().await.unwrap();
|
||||||
match result {
|
match result {
|
||||||
|
Loading…
Reference in New Issue
Block a user