use crate::models::{ChangeHash, Identifier, TimestampInSeconds};
use core::fmt::{Display, Formatter};
use minicbor::bytes::ByteVec;
use minicbor::{CborLen, Decode, Encode};
use ockam_core::compat::string::String;
use ockam_core::compat::{collections::BTreeMap, vec::Vec};
use ockam_vault::{ECDSASHA256CurveP256Signature, EdDSACurve25519Signature};
pub const CREDENTIAL_DATA_TYPE: u8 = 3;
#[derive(Clone, Debug, PartialEq, Eq, Encode, Decode, CborLen)]
#[rustfmt::skip]
pub struct Credential {
#[cbor(with = "minicbor::bytes")]
#[n(0)] pub data: Vec<u8>,
#[n(1)] pub signature: CredentialSignature,
}
#[derive(Clone, Debug, PartialEq, Eq, Encode, Decode, CborLen)]
#[rustfmt::skip]
pub enum CredentialSignature {
#[n(0)] EdDSACurve25519(#[n(0)] EdDSACurve25519Signature),
#[n(1)] ECDSASHA256CurveP256(#[n(0)] ECDSASHA256CurveP256Signature),
}
#[derive(Clone, Debug, PartialEq, Eq, Encode, Decode, CborLen)]
#[rustfmt::skip]
pub struct CredentialData {
#[n(0)] pub subject: Option<Identifier>,
#[n(1)] pub subject_latest_change_hash: Option<ChangeHash>,
#[n(2)] pub subject_attributes: Attributes,
#[n(3)] pub created_at: TimestampInSeconds,
#[n(4)] pub expires_at: TimestampInSeconds,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Encode, Decode, CborLen)]
#[rustfmt::skip]
#[cbor(transparent)]
pub struct CredentialSchemaIdentifier(#[n(0)] pub u64);
#[derive(Clone, Debug, PartialEq, Eq, Encode, Decode, CborLen)]
#[rustfmt::skip]
pub struct Attributes {
#[n(0)] pub schema: CredentialSchemaIdentifier,
#[n(1)] pub map: BTreeMap<ByteVec, ByteVec>,
}
impl Display for Attributes {
fn fmt(&self, f: &mut Formatter<'_>) -> core::fmt::Result {
let mut attributes = vec![];
for (key, value) in self.map.clone() {
let key = Vec::<u8>::from(key);
let value = Vec::<u8>::from(value);
let key =
String::from_utf8(key.clone()).unwrap_or(format!("HEX:{}", hex::encode(&key)));
let value =
String::from_utf8(value.clone()).unwrap_or(format!("HEX:{}", hex::encode(&value)));
attributes.push(format!("{key}={value}"))
}
f.debug_struct("Attributes")
.field("attrs", &attributes.join(","))
.finish_non_exhaustive()
}
}