use std::collections::HashMap; use std::fs::File; use std::io::prelude::*; use std::env; use serde::{Serialize, Deserialize}; pub mod request; pub mod keystore; pub mod videostore; pub mod err; use request::ApiKey; fn filename() -> String { match env::var("CLIP_KEY_STORE") { Ok(val) => val, Err(_) => "store.json".to_string() } } fn dev_urandom() -> std::io::Result { // Creates a random hex string that is generated from 48 bytes 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); } fn uid() -> std::io::Result { let raw = dev_urandom()?; Ok(raw[..8].to_string()) } #[derive(Serialize, Deserialize)] pub struct VideoMeta { pub id: String, pub name: String, pub desc: Option, pub ext: String, } #[derive(Serialize, Deserialize)] struct VideoMetaEntry { pub name: String, pub desc: Option, pub ext: String } #[derive(Serialize, Deserialize)] pub struct DB { keys: Vec, // We map the video meta id to its actual body content videos: HashMap } // TODO: add some proper lifetime management here and some docs pub trait KeyStore { fn new_entry(name: String) -> err::Result; fn remove_entry(name: String) -> err::Result; fn get_entry(name: String) -> err::Result>; fn new_store(new_filename: String) -> err::Result<()>; } pub trait VideoStore { fn new_video(name: &str, desc: &str, ext: &str) -> err::Result<()>; fn del_video(id: String) -> err::Result<()>; fn get_video_by_name(name: &str) -> err::Result>; fn get_video_by_id(id: &str) -> err::Result>; fn rename_video(id: String, new: &str) -> err::Result; fn redescribe_video(id: String, new: &str) -> err::Result; }