From 4b836e453d3048949b948e0b0d8af822562a0f1f Mon Sep 17 00:00:00 2001 From: Jeff Baskin Date: Sat, 9 Nov 2024 07:56:49 -0500 Subject: [PATCH] Added a record. --- src/fields/mod.rs | 32 --------------------- src/lib.rs | 5 +--- src/record/id.rs | 37 ++++++++++++++++++++++++ src/record/mod.rs | 71 +++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 109 insertions(+), 36 deletions(-) delete mode 100644 src/fields/mod.rs create mode 100644 src/record/id.rs create mode 100644 src/record/mod.rs diff --git a/src/fields/mod.rs b/src/fields/mod.rs deleted file mode 100644 index fa25bde..0000000 --- a/src/fields/mod.rs +++ /dev/null @@ -1,32 +0,0 @@ -use std::fmt; -use uuid::Uuid; - -struct ID { - data: Uuid, -} - -impl ID { - fn new(id: Uuid) -> Self { - Self { - data: id, - } - } -} - -impl fmt::Display for ID { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "{}", self.data) - } -} - -#[cfg(test)] -mod id { - use super::*; - - #[test] - fn id_new() { - let data = Uuid::new_v4(); - let id = ID::new(data.clone()); - assert_eq!(id.to_string(), data.to_string()); - } -} diff --git a/src/lib.rs b/src/lib.rs index 86d1293..1da36de 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,12 +1,9 @@ mod client; -mod fields; +mod record; mod message; mod router; mod session; -//use client::ClientMsg; -//use router::Router; -//use session::{Session, SessionFilter, SessionMsg}; use client::{Client, ClientMsg}; use message::{Message, MsgData}; use router::Router; diff --git a/src/record/id.rs b/src/record/id.rs new file mode 100644 index 0000000..7e61cab --- /dev/null +++ b/src/record/id.rs @@ -0,0 +1,37 @@ +use std::fmt; +use uuid::Uuid; + +#[derive(Clone)] +pub struct ID { + data: Uuid, +} + +impl ID { + pub fn new() -> Self { + Self { + data: Uuid::new_v4(), + } + } +} + +impl fmt::Display for ID { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "{}", self.data) + } +} + +#[cfg(test)] +mod id { + use super::*; + + #[test] + fn id_are_unique() { + let mut ids: Vec = Vec::new(); + for _ in 1..10 { + let id = ID::new(); + let id_string = id.to_string(); + assert!(!ids.contains(&id_string), "'{}' repeated", id_string); + ids.push(id_string); + } + } +} diff --git a/src/record/mod.rs b/src/record/mod.rs new file mode 100644 index 0000000..274a013 --- /dev/null +++ b/src/record/mod.rs @@ -0,0 +1,71 @@ +mod id; + +use id::ID; +use std::{ + collections::HashMap, + fmt, +}; + +#[derive(Clone)] +enum Field { + ID(ID), +} + +struct Record { + data: HashMap, +} + +impl Record { + fn new(data: HashMap) -> Self { + Self { + data: data, + } + } + + fn len(&self) -> usize { + self.data.len() + } + + fn get(&self, name: &str) -> Field { + match self.data.get(name) { + Some(data) => data.clone(), + None => unreachable!(), + } + } +} + +impl fmt::Display for Field { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + Field::ID(id) => write!(f, "{}", id), + } + } +} + +#[cfg(test)] +mod records { + use super::*; + + #[test] + fn new_record() { + let data: HashMap = HashMap::new(); + let rec = Record::new(data); + assert_eq!(rec.len(), 0); + } + + #[test] + fn new_record_more_data() { + let a = ID::new(); + let b = ID::new(); + let c = ID::new(); + let mut data: HashMap = HashMap::new(); + data.insert("a".to_string(), Field::ID(a.clone())); + data.insert("b".to_string(), Field::ID(b.clone())); + data.insert("c".to_string(), Field::ID(c.clone())); + let rec = Record::new(data); + assert_eq!(rec.len(), 3); + assert_eq!(rec.get("a").to_string(), a.to_string(), "record a"); + assert_eq!(rec.get("b").to_string(), b.to_string(), "record b"); + assert_eq!(rec.get("c").to_string(), c.to_string(), "record c"); + } +}