+ 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
This commit is contained in:
commit
01f64375f2
10
dblib/Cargo.toml
Normal file
10
dblib/Cargo.toml
Normal file
@ -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" }
|
77
dblib/src/lib.rs
Normal file
77
dblib/src/lib.rs
Normal file
@ -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<String> {
|
||||
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<String>
|
||||
}
|
||||
|
||||
|
||||
impl DB {
|
||||
pub fn new_entry(filename: String) -> Result<String, Box<dyn Error>> {
|
||||
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<dyn Error>> {
|
||||
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<Option<String>, Box<dyn Error>> {
|
||||
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)
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user