use hedera_proto::services;
use prost::Message;
use time::OffsetDateTime;
use crate::protobuf::ToProtobuf;
use crate::{
AccountId,
FromProtobuf,
LedgerId,
NftId,
};
#[derive(Debug, Clone)]
#[cfg_attr(feature = "ffi", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "ffi", serde(rename_all = "camelCase"))]
pub struct TokenNftInfo {
pub nft_id: NftId,
pub account_id: AccountId,
#[cfg_attr(
feature = "ffi",
serde(with = "serde_with::As::<serde_with::TimestampNanoSeconds>")
)]
pub creation_time: OffsetDateTime,
#[cfg_attr(feature = "ffi", serde(with = "serde_with::As::<serde_with::base64::Base64>"))]
pub metadata: Vec<u8>,
pub spender_id: Option<AccountId>,
pub ledger_id: LedgerId,
}
impl TokenNftInfo {
pub fn from_bytes(bytes: &[u8]) -> crate::Result<Self> {
FromProtobuf::<services::TokenNftInfo>::from_bytes(bytes)
}
#[must_use]
pub fn to_bytes(&self) -> Vec<u8> {
services::TokenNftInfo {
nft_id: Some(self.nft_id.to_protobuf()),
account_id: Some(self.account_id.to_protobuf()),
creation_time: Some(self.creation_time.to_protobuf()),
metadata: self.metadata.clone(),
ledger_id: self.ledger_id.to_bytes(),
spender_id: self.spender_id.to_protobuf(),
}
.encode_to_vec()
}
}
impl FromProtobuf<services::response::Response> for TokenNftInfo {
fn from_protobuf(pb: services::response::Response) -> crate::Result<Self>
where
Self: Sized,
{
let pb = pb_getv!(pb, TokenGetNftInfo, services::response::Response);
let nft = pb_getf!(pb, nft)?;
Self::from_protobuf(nft)
}
}
impl FromProtobuf<services::TokenNftInfo> for TokenNftInfo {
fn from_protobuf(pb: services::TokenNftInfo) -> crate::Result<Self>
where
Self: Sized,
{
let nft_id = pb_getf!(pb, nft_id)?;
let account_id = pb_getf!(pb, account_id)?;
let creation_time = pb.creation_time.unwrap();
let metadata = pb.metadata;
let spender_account_id = Option::from_protobuf(pb.spender_id)?;
Ok(Self {
nft_id: NftId::from_protobuf(nft_id)?,
account_id: AccountId::from_protobuf(account_id)?,
creation_time: OffsetDateTime::from(creation_time),
metadata,
spender_id: spender_account_id,
ledger_id: LedgerId::from_bytes(pb.ledger_id),
})
}
}