From 01f64375f22b0667c5093d90b2d6f966337caaa2 Mon Sep 17 00:00:00 2001 From: shockrah Date: Mon, 6 Sep 2021 16:32:37 -0700 Subject: [PATCH] + DBLib which is basically our "datbase" driver This stands to be the only data we're going to bother supporting right now THe reason for this is because of sheer lazyness --- dblib/Cargo.toml | 10 +++++++ dblib/src/lib.rs | 77 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 87 insertions(+) create mode 100644 dblib/Cargo.toml create mode 100644 dblib/src/lib.rs diff --git a/dblib/Cargo.toml b/dblib/Cargo.toml new file mode 100644 index 0000000..5caf219 --- /dev/null +++ b/dblib/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "dblib" +version = "0.1.0" +edition = "2018" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +serde = { version = "1.0", features = ["derive"] } +serde_json = { version = "1.0" } diff --git a/dblib/src/lib.rs b/dblib/src/lib.rs new file mode 100644 index 0000000..d844753 --- /dev/null +++ b/dblib/src/lib.rs @@ -0,0 +1,77 @@ +use std::error::Error; +use std::fs::File; +use std::io::BufReader; +use std::io::prelude::*; + +use serde::{Serialize, Deserialize}; + +fn dev_urandom() -> std::io::Result { + let mut file = File::open("/dev/urandom")?; + let mut buf: [u8;48] = [0;48]; + file.read_exact(&mut buf)?; + let mut output = String::new(); + for byte in buf.iter() { + let hex = format!("{:02X}", byte); + output.push_str(hex.as_str()); + } + + // Return the hex encoded random bytes + return Ok(output); +} + + +#[derive(Serialize, Deserialize)] +pub struct DB { + keys: Vec +} + + +impl DB { + pub fn new_entry(filename: String) -> Result> { + let file = File::open(filename.as_str())?; + let reader = BufReader::new(file); + + let mut data: DB = serde_json::from_reader(reader)?; + // Generate some new key data + let key = dev_urandom(); // create a new key + // Add that new key to the json file + match key { + Ok(key) => { + data.keys.push(key.clone()); + + let file = File::open(filename)?; + serde_json::to_writer(file, &data)?; + + return Ok(key) + }, + Err(e) => { + panic!() + } + } + } + + pub fn remove_entry(filename: String, key: String) -> Result<(), Box> { + let file = File::open(filename.as_str())?; + let reader = BufReader::new(file); + + let mut data: DB = serde_json::from_reader(reader)?; + let idx = data.keys.iter().position(|item| key == key); + if let Some(idx) = idx { + data.keys.remove(idx); + } + + Ok(()) + } + + pub fn get_entry(filename: String, key: String) -> Result, Box> { + let file = File::open(filename.as_str())?; + let reader = BufReader::new(file); + + let data: DB = serde_json::from_reader(reader)?; + // WARNING: extreme autism + match data.keys.iter().find(|item| item.clone() == &key) { + Some(item) => Ok(Some(item.clone())), + None => Ok(None) + } + } +}