use std::collections::HashMap; use std::fs::File; use std::io::BufReader; use std::io::BufWriter; use crate::{err, DB, dev_urandom, KeyStore}; use crate::ApiKey; impl KeyStore for DB { fn new_entry(filename: String, name: String) -> err::Result { //! Create a new API key entry in the data-store given by //! Key value is generated via /dev/urandom on unix systems 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().unwrap(); // create a new key let entry = ApiKey { key: key.clone(), name }; // Finally write back the data to the structure and disk data.keys.push(entry); let file = File::open(filename.as_str())?; let writer = BufWriter::new(file); serde_json::to_writer(writer, &data)?; Ok(key) } fn remove_entry(filename: String, name: String) -> err::Result { //! Removes the API key entry based on the given name 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| item.name == name); if let Some(idx) = idx { data.keys.remove(idx); Ok(true) } else { Ok(false) } } fn get_entry(filename: String, name: String) -> err::Result> { //! Get the API key based on name 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.name == name) { Some(item) => Ok(Some(item.key.clone())), None => Ok(None) } } fn new_store(filename: String) -> err::Result<()> { //! Generate a new empty data store with the given filename //! NOTE: The filename must include the extension(programmatically) let file = File::create(filename)?; let empty = DB { keys: vec![] , videos: HashMap::new() }; let writer = BufWriter::new(file); serde_json::to_writer(writer, &empty)?; Ok(()) } }