use secrecy::Zeroize;
use serde::{Deserialize, Serialize};
use crate::kbs2::util;
pub static RECORD_KINDS: &[&str] = &["login", "environment", "unstructured"];
#[derive(Debug, Deserialize, PartialEq, Serialize)]
pub struct Record {
pub timestamp: u64,
pub label: String,
pub body: RecordBody,
}
impl Zeroize for Record {
fn zeroize(&mut self) {
self.timestamp.zeroize();
self.label.zeroize();
self.body.zeroize();
}
}
#[derive(Debug, Deserialize, PartialEq, Serialize)]
#[serde(tag = "kind", content = "fields")]
pub enum RecordBody {
Login(LoginFields),
Environment(EnvironmentFields),
Unstructured(UnstructuredFields),
}
impl Zeroize for RecordBody {
fn zeroize(&mut self) {
match self {
RecordBody::Login(l) => l.zeroize(),
RecordBody::Environment(e) => e.zeroize(),
RecordBody::Unstructured(u) => u.zeroize(),
};
}
}
impl std::fmt::Display for RecordBody {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
match *self {
RecordBody::Login(_) => write!(f, "login"),
RecordBody::Environment(_) => write!(f, "environment"),
RecordBody::Unstructured(_) => write!(f, "unstructured"),
}
}
}
#[derive(Debug, Deserialize, PartialEq, Serialize)]
pub struct LoginFields {
pub username: String,
pub password: String,
}
impl Zeroize for LoginFields {
fn zeroize(&mut self) {
self.username.zeroize();
self.password.zeroize();
}
}
#[derive(Debug, Deserialize, PartialEq, Serialize)]
pub struct EnvironmentFields {
pub variable: String,
pub value: String,
}
impl Zeroize for EnvironmentFields {
fn zeroize(&mut self) {
self.variable.zeroize();
self.value.zeroize();
}
}
#[derive(Debug, Deserialize, PartialEq, Serialize)]
pub struct UnstructuredFields {
pub contents: String,
}
impl Zeroize for UnstructuredFields {
fn zeroize(&mut self) {
self.contents.zeroize();
}
}
impl Record {
pub fn new(label: &str, body: RecordBody) -> Record {
Record {
timestamp: util::current_timestamp(),
label: label.into(),
body,
}
}
}