use crate::error::Result;
use crate::service::Service;
use libipld::cbor::DagCborCodec;
use libipld::cid::Cid;
use libipld::codec::Codec as _;
use libipld::DagCbor;
use std::time::{Duration, UNIX_EPOCH};
#[derive(Clone, Debug, Eq, PartialEq, DagCbor)]
pub struct Claim {
claim: UnsignedClaim,
signature: Vec<u8>,
}
impl Claim {
pub fn new(claim: UnsignedClaim, signature: Vec<u8>) -> Self {
Self { claim, signature }
}
pub fn claim(&self) -> &UnsignedClaim {
&self.claim
}
pub fn signature(&self) -> &[u8] {
&self.signature
}
}
impl core::fmt::Display for Claim {
fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
write!(f, "{:?}", self.claim().body)
}
}
#[derive(Clone, Debug, Eq, PartialEq, DagCbor)]
pub struct UnsignedClaim {
pub genesis: Vec<u8>,
pub block: Vec<u8>,
pub uid: u64,
pub public: String,
pub prev: Option<Cid>,
pub seqno: u32,
pub ctime: u64,
pub expire_in: u64,
pub body: ClaimBody,
}
impl UnsignedClaim {
pub fn expired(&self) -> bool {
let expires_at = Duration::from_millis(self.ctime.saturating_add(self.expire_in));
UNIX_EPOCH.elapsed().unwrap() > expires_at
}
pub fn to_bytes(&self) -> Result<Box<[u8]>> {
Ok(DagCborCodec::encode(self)?)
}
}
#[derive(Clone, Debug, Eq, PartialEq, DagCbor)]
pub enum ClaimBody {
Ownership(Service),
Revoke(u32),
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub enum IdentityStatus {
Expired,
Revoked,
ProofNotFound,
Active(String),
}
impl core::fmt::Display for IdentityStatus {
fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
match self {
Self::Expired => write!(f, "expired"),
Self::Revoked => write!(f, "revoked"),
Self::ProofNotFound => write!(f, "proof not found"),
Self::Active(proof) => write!(f, "{}", proof),
}
}
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct IdentityInfo {
pub service: Service,
pub claims: Vec<Claim>,
pub status: IdentityStatus,
}
impl core::fmt::Display for IdentityInfo {
fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
write!(f, "{} {}", self.service, self.status)
}
}