use std::fmt::{self, Debug, Display, Formatter};
use chrono::{DateTime, TimeZone, Utc};
use rgb::{ChainNet, ContractId, Genesis, Identity, Operation, Schema, SchemaId};
use strict_encoding::TypeName;
#[derive(Clone, Ord, PartialOrd, Eq, PartialEq, Debug)]
#[cfg_attr(
feature = "serde",
derive(Serialize, Deserialize),
serde(crate = "serde_crate", rename_all = "camelCase")
)]
pub struct SchemaInfo {
pub id: SchemaId,
pub name: TypeName,
}
impl SchemaInfo {
pub fn with(schema: &Schema) -> Self {
SchemaInfo {
id: schema.schema_id(),
name: schema.name.clone(),
}
}
}
impl Display for SchemaInfo {
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
write!(f, "{: <24}", self.name.to_string())?;
write!(f, "\t{: <80}", self.id.to_string())?;
Ok(())
}
}
#[derive(Clone, Eq, PartialEq, Hash, Debug)]
#[cfg_attr(
feature = "serde",
derive(Serialize, Deserialize),
serde(crate = "serde_crate", rename_all = "camelCase")
)]
pub struct ContractInfo {
pub id: ContractId,
pub schema_id: SchemaId,
pub issuer: Identity,
pub issued_at: DateTime<Utc>,
pub chain_net: ChainNet,
}
impl ContractInfo {
pub fn with(genesis: &Genesis) -> Self {
ContractInfo {
id: genesis.contract_id(),
schema_id: genesis.schema_id,
issuer: genesis.issuer.clone(),
issued_at: Utc
.timestamp_opt(genesis.timestamp, 0)
.single()
.unwrap_or_else(Utc::now),
chain_net: genesis.chain_net,
}
}
}
impl Display for ContractInfo {
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
write!(f, "{}", self.id)?;
write!(f, "\t{}", self.chain_net)?;
write!(f, "\t{}", self.issued_at.format("%Y-%m-%d"))?;
writeln!(f, "\t{: <80}", self.schema_id.to_string())?;
writeln!(f, " Developer: {}", self.issuer)
}
}