use std::fmt::Display;
use base64ct::{Base64, Encoding as _};
#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
use crate::backend::BackendType;
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
#[cfg_attr(feature = "serde", derive(Deserialize, Serialize))]
pub enum CertificateType {
OpenPgp,
}
impl CertificateType {
pub fn with_framing(&self, raw_bytes: &[u8]) -> CertificateData {
let bytes = Base64::encode_string(raw_bytes);
match self {
CertificateType::OpenPgp => CertificateData(format!(
"-----BEGIN PGP PUBLIC KEY BLOCK-----\n\n{bytes}\n-----END PGP PUBLIC KEY BLOCK-----"
)),
}
}
}
#[derive(Debug)]
#[cfg_attr(feature = "serde", derive(Deserialize, Serialize))]
pub struct CertificateData(String);
impl AsRef<str> for CertificateData {
fn as_ref(&self) -> &str {
&self.0
}
}
impl Display for CertificateData {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
self.0.fmt(f)
}
}
#[derive(Debug)]
#[cfg_attr(feature = "serde", derive(Deserialize, Serialize))]
pub struct Certificate {
pub certificate: CertificateData,
pub r#type: CertificateType,
pub backend_id: BackendType,
pub signing_key_id: String,
}
#[derive(Debug)]
#[cfg_attr(feature = "serde", derive(Deserialize, Serialize))]
pub struct Certificates {
pub certs: Vec<Certificate>,
}