use record::{EncryptedBody, Header, Payload, Record};
use serde::{de::DeserializeOwned, Serialize};
use users::User;
use base64;
use serde_json::{self, Error as SerdeError};
pub trait Body: DeserializeOwned + Serialize {
fn get_field(&self, key: &str) -> Option<&Payload>;
fn set_field(&mut self, key: &str, value: Payload) -> Option<()>;
fn flatten(&mut self) -> Option<()>;
}
pub trait LoadRecord<T: Body> {
fn header() -> Header {
unimplemented!()
}
fn body() -> T {
unimplemented!()
}
}
pub trait UserLogin {
fn login(name: &str, password: &str, salt: &str) -> Option<User>;
}
pub trait Encryptable: AutoEncoder {}
pub trait EncryptionHandler<T>
where
T: Encryptable + AutoEncoder + Body,
{
fn encrypt(&mut self, item: T) -> EncryptedBody;
fn decrypt(&mut self, item: EncryptedBody) -> Option<T>;
}
pub trait Loading {
fn load(_path: &str) -> Box<Self> {
unimplemented!()
}
fn save(&mut self, _path: &str) {
unimplemented!()
}
}
pub trait Vault<T>
where
T: Body,
{
fn new(name: &str, location: &str) -> Self;
fn fetch(&mut self);
fn pull(&mut self, name: &str);
fn sync(&mut self);
fn get_record(&self, name: &str) -> Option<&Record<T>>;
fn contains(&self, name: &str) -> bool;
fn add_record(&mut self, key: &str, category: &str, tags: Vec<&str>);
fn delete_record(&mut self, record: &str) -> Option<Record<T>>;
fn add_data(&mut self, record: &str, key: &str, data: Payload) -> Option<()>;
fn get_data(&self, record: &str, key: &str) -> Option<&Payload>;
}
pub trait AutoEncoder: Serialize + DeserializeOwned {
fn encode(&self) -> Result<String, SerdeError> {
serde_json::to_string_pretty(self)
}
fn decode(s: &str) -> Result<Self, SerdeError> {
serde_json::from_str(s)
}
}
pub trait Base64AutoEncoder {
fn to_base64(&self) -> String;
fn from_base64(base64: &str) -> String;
}
impl Base64AutoEncoder for String {
fn to_base64(&self) -> String {
base64::encode(self.as_bytes())
}
fn from_base64(base64: &str) -> String {
String::from_utf8(base64::decode(base64).unwrap()).unwrap()
}
}