use ockam_core::compat::vec::Vec;
use ockam_core::vault::PublicKey;
use ockam_core::Result;
use serde::{Deserialize, Serialize};
pub use crate::signature::*;
use crate::{CreateKeyChange, EventIdentifier, ProfileEventAttributes, RotateKeyChange};
#[non_exhaustive]
pub struct ProfileEventAttributeKey;
impl ProfileEventAttributeKey {
pub const FRIENDLY_NAME: &'static str = "OCKAM_FN";
pub const CREATION_DATE: &'static str = "OCKAM_CD";
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct ProfileChange {
version: u8,
attributes: ProfileEventAttributes,
change_type: ProfileChangeType,
}
impl ProfileChange {
pub fn version(&self) -> u8 {
self.version
}
pub fn attributes(&self) -> &ProfileEventAttributes {
&self.attributes
}
pub fn change_type(&self) -> &ProfileChangeType {
&self.change_type
}
}
impl ProfileChange {
pub(crate) fn new(
version: u8,
attributes: ProfileEventAttributes,
change_type: ProfileChangeType,
) -> Self {
Self {
version,
attributes,
change_type,
}
}
pub fn has_label(&self, label: &str) -> bool {
self.label() == label
}
pub fn label(&self) -> &str {
match &self.change_type {
ProfileChangeType::CreateKey(change) => change.data().key_attributes().label(),
ProfileChangeType::RotateKey(change) => change.data().key_attributes().label(),
}
}
pub(crate) fn public_key(&self) -> Result<PublicKey> {
Ok(match &self.change_type {
ProfileChangeType::CreateKey(change) => change.data().public_key(),
ProfileChangeType::RotateKey(change) => change.data().public_key(),
}
.clone())
}
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub enum ProfileChangeType {
CreateKey(CreateKeyChange),
RotateKey(RotateKeyChange),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ChangeBlock {
change: ProfileChange,
prev_event_id: EventIdentifier,
}
impl ChangeBlock {
pub fn previous_event_identifier(&self) -> &EventIdentifier {
&self.prev_event_id
}
pub fn change(&self) -> &ProfileChange {
&self.change
}
}
impl ChangeBlock {
pub fn new(prev_event_id: EventIdentifier, change: ProfileChange) -> Self {
Self {
prev_event_id,
change,
}
}
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct ProfileChangeEvent {
identifier: EventIdentifier,
change_block: ChangeBlock,
signatures: Vec<Signature>,
}
pub type Changes = Vec<ProfileChangeEvent>;
impl ProfileChangeEvent {
pub fn identifier(&self) -> &EventIdentifier {
&self.identifier
}
pub fn change_block(&self) -> &ChangeBlock {
&self.change_block
}
pub fn signatures(&self) -> &[Signature] {
&self.signatures
}
}
impl ProfileChangeEvent {
pub fn new(
identifier: EventIdentifier,
change_block: ChangeBlock,
signatures: Vec<Signature>,
) -> Self {
ProfileChangeEvent {
identifier,
change_block,
signatures,
}
}
}