use hedera_proto::services;
use prost::Message;
use time::{
Duration,
OffsetDateTime,
};
use crate::protobuf::ToProtobuf;
use crate::{
AccountId,
FileId,
FromProtobuf,
KeyList,
LedgerId,
};
#[derive(Debug, Clone)]
#[cfg_attr(feature = "ffi", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "ffi", serde(rename_all = "camelCase"))]
pub struct FileInfo {
pub file_id: FileId,
pub size: u64,
#[cfg_attr(
feature = "ffi",
serde(with = "serde_with::As::<Option<serde_with::TimestampNanoSeconds>>")
)]
pub expiration_time: Option<OffsetDateTime>,
pub auto_renew_period: Option<Duration>,
pub auto_renew_account_id: Option<AccountId>,
pub is_deleted: bool,
pub keys: KeyList,
pub file_memo: String,
pub ledger_id: LedgerId,
}
impl FileInfo {
pub fn from_bytes(bytes: &[u8]) -> crate::Result<Self> {
FromProtobuf::<services::file_get_info_response::FileInfo>::from_bytes(bytes)
}
#[must_use]
pub fn to_bytes(&self) -> Vec<u8> {
services::file_get_info_response::FileInfo {
file_id: Some(self.file_id.to_protobuf()),
size: self.size as i64,
expiration_time: self.expiration_time.to_protobuf(),
auto_renew_account: self.auto_renew_account_id.to_protobuf(),
auto_renew_period: self.auto_renew_period.to_protobuf(),
deleted: self.is_deleted,
memo: self.file_memo.clone(),
ledger_id: self.ledger_id.to_bytes(),
keys: None,
}
.encode_to_vec()
}
}
impl FromProtobuf<services::response::Response> for FileInfo {
#[allow(deprecated)]
fn from_protobuf(pb: services::response::Response) -> crate::Result<Self>
where
Self: Sized,
{
let response = pb_getv!(pb, FileGetInfo, services::response::Response);
let info = pb_getf!(response, file_info)?;
Self::from_protobuf(info)
}
}
impl FromProtobuf<services::file_get_info_response::FileInfo> for FileInfo {
#[allow(deprecated)]
fn from_protobuf(pb: services::file_get_info_response::FileInfo) -> crate::Result<Self>
where
Self: Sized,
{
let file_id = pb_getf!(pb, file_id)?;
let ledger_id = LedgerId::from_bytes(pb.ledger_id);
let auto_renew_account_id = Option::from_protobuf(pb.auto_renew_account)?;
Ok(Self {
file_id: FileId::from_protobuf(file_id)?,
size: pb.size as u64,
expiration_time: pb.expiration_time.map(Into::into),
auto_renew_account_id,
auto_renew_period: pb.auto_renew_period.map(Into::into),
is_deleted: pb.deleted,
file_memo: pb.memo,
ledger_id,
keys: KeyList::from_protobuf(pb.keys.unwrap_or_default())?,
})
}
}