From 3ca71733c23fb3cda72be7f3fcd29fba04c70c52 Mon Sep 17 00:00:00 2001 From: Jeff Baskin Date: Fri, 27 Jan 2023 12:44:26 -0500 Subject: [PATCH] Switched add database from option to result. --- src/morethantext/databases.rs | 85 +++++++++++++++++++++++++---------- 1 file changed, 61 insertions(+), 24 deletions(-) diff --git a/src/morethantext/databases.rs b/src/morethantext/databases.rs index 1623689..5aa4759 100644 --- a/src/morethantext/databases.rs +++ b/src/morethantext/databases.rs @@ -13,12 +13,14 @@ impl Databases { } } - fn add_database(&mut self, name: &str, id: &str) -> Option { - if name.len() == 0 || self.db_map.contains_key(name) { - None + fn add_database(&mut self, name: &str, id: &str) -> Result { + if name.len() == 0 { + return Err(DBError::new("database names cannot be empty")); + } else if self.db_map.contains_key(name) { + return Err(DBError::new("database already exists")); } else { self.db_map.insert(name.to_string(), id.to_string()); - Some(id.to_string()) + Ok(id.to_string()) } } @@ -63,8 +65,16 @@ impl FileData for Databases { } if letter == 0 { if get_id { - output - .add_database(str::from_utf8(&name).unwrap(), str::from_utf8(&id).unwrap()); + match output + .add_database(str::from_utf8(&name).unwrap(), str::from_utf8(&id).unwrap()) + { + Ok(_) => (), + Err(err) => { + let mut error = DBError::new("file corruption"); + error.add_source(err); + return Err(error); + } + }; name.clear(); id.clear(); } @@ -90,10 +100,8 @@ mod functions { let name = "fred"; let id = "123456"; let mut dbs = Databases::new(); - let output = dbs.add_database(name, id); - assert_eq!(output, Some(id.to_string())); - let output = dbs.get_database(name); - assert_eq!(output, Some(id.to_string())); + let output = dbs.add_database(name, id).unwrap(); + assert_eq!(output, id.to_string()); } #[test] @@ -101,8 +109,10 @@ mod functions { let name = ""; let id = "123456"; let mut dbs = Databases::new(); - let output = dbs.add_database(name, id); - assert_eq!(output, None); + match dbs.add_database(name, id) { + Ok(_) => assert!(false, "There should have been an error"), + Err(err) => assert_eq!(err.to_string(), "database names cannot be empty"), + } } #[test] @@ -110,9 +120,11 @@ mod functions { let name = "barney"; let id = "abcde"; let mut dbs = Databases::new(); - dbs.add_database(name, id); - let output = dbs.add_database(name, "09876"); - assert_eq!(output, None); + dbs.add_database(name, id).unwrap(); + match dbs.add_database(name, "09876") { + Ok(_) => assert!(false, "There should have been an error"), + Err(err) => assert_eq!(err.to_string(), "database already exists"), + } let output = dbs.get_database(name); assert_eq!(output, Some(id.to_string())); } @@ -127,11 +139,11 @@ mod functions { #[test] fn list_databases() { let mut dbs = Databases::new(); - dbs.add_database("zebra", "a"); - dbs.add_database("alpha", "a"); - dbs.add_database("charlie", "a"); - dbs.add_database("wilma", "a"); - dbs.add_database("frank", "a"); + dbs.add_database("zebra", "a").unwrap(); + dbs.add_database("alpha", "a").unwrap(); + dbs.add_database("charlie", "a").unwrap(); + dbs.add_database("wilma", "a").unwrap(); + dbs.add_database("frank", "a").unwrap(); let expected = ["alpha", "charlie", "frank", "wilma", "zebra"]; let output = dbs.show(); assert_eq!(output, expected); @@ -141,6 +153,7 @@ mod functions { #[cfg(test)] mod filedata { use super::*; + use std::error::Error; #[test] fn to_bytes_new() { @@ -155,7 +168,7 @@ mod filedata { let mut dbs = Databases::new(); let name = "something"; let id = "id"; - dbs.add_database(name, id); + dbs.add_database(name, id).unwrap(); let mut expected: Vec = Vec::new(); expected.append(&mut name.as_bytes().to_vec()); expected.push(0); @@ -168,9 +181,9 @@ mod filedata { #[test] fn from_bytes() { let mut dbs = Databases::new(); - dbs.add_database("one", "1"); - dbs.add_database("two", "2"); - dbs.add_database("three", "3"); + dbs.add_database("one", "1").unwrap(); + dbs.add_database("two", "2").unwrap(); + dbs.add_database("three", "3").unwrap(); let data = dbs.to_bytes(); let mut feed = data.iter(); let output = Databases::from_bytes(&mut feed).unwrap(); @@ -198,4 +211,28 @@ mod filedata { Err(err) => assert_eq!(err.to_string(), "file corruption"), } } + + #[test] + fn from_bytes_handles_error() { + let mut data = "duplicate".as_bytes().to_vec(); + data.push(0); + data.append(&mut "first".as_bytes().to_vec()); + data.push(0); + data.append(&mut "duplicate".as_bytes().to_vec()); + data.push(0); + data.append(&mut "second".as_bytes().to_vec()); + data.push(0); + 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"); + assert!( + err.source().is_some(), + "Should state file corruption cause." + ); + assert_eq!(err.source().unwrap().to_string(), "database already exists") + } + } + } }