hiero_sdk/file/
file_info_query.rs1use hiero_sdk_proto::services;
4use hiero_sdk_proto::services::file_service_client::FileServiceClient;
5use tonic::transport::Channel;
6
7use crate::ledger_id::RefLedgerId;
8use crate::query::{
9 AnyQueryData,
10 QueryExecute,
11 ToQueryProtobuf,
12};
13use crate::{
14 BoxGrpcFuture,
15 Error,
16 FileId,
17 FileInfo,
18 Query,
19 ToProtobuf,
20 ValidateChecksums,
21};
22
23pub type FileInfoQuery = Query<FileInfoQueryData>;
25
26#[derive(Default, Clone, Debug)]
27pub struct FileInfoQueryData {
28 file_id: Option<FileId>,
29}
30
31impl From<FileInfoQueryData> for AnyQueryData {
32 #[inline]
33 fn from(data: FileInfoQueryData) -> Self {
34 Self::FileInfo(data)
35 }
36}
37
38impl FileInfoQuery {
39 #[must_use]
41 pub fn get_file_id(&self) -> Option<FileId> {
42 self.data.file_id
43 }
44
45 pub fn file_id(&mut self, id: impl Into<FileId>) -> &mut Self {
47 self.data.file_id = Some(id.into());
48 self
49 }
50}
51
52impl ToQueryProtobuf for FileInfoQueryData {
53 fn to_query_protobuf(&self, header: services::QueryHeader) -> services::Query {
54 let file_id = self.file_id.to_protobuf();
55
56 services::Query {
57 query: Some(services::query::Query::FileGetInfo(services::FileGetInfoQuery {
58 file_id,
59 header: Some(header),
60 })),
61 }
62 }
63}
64
65impl QueryExecute for FileInfoQueryData {
66 type Response = FileInfo;
67
68 fn execute(
69 &self,
70 channel: Channel,
71 request: services::Query,
72 ) -> BoxGrpcFuture<'_, services::Response> {
73 Box::pin(async { FileServiceClient::new(channel).get_file_info(request).await })
74 }
75}
76
77impl ValidateChecksums for FileInfoQueryData {
78 fn validate_checksums(&self, ledger_id: &RefLedgerId) -> Result<(), Error> {
79 self.file_id.validate_checksums(ledger_id)
80 }
81}
82
83#[cfg(test)]
84mod tests {
85 use expect_test::expect;
86
87 use crate::query::ToQueryProtobuf;
88 use crate::{
89 FileContentsQuery,
90 FileId,
91 FileInfoQuery,
92 Hbar,
93 };
94
95 #[test]
96 fn serialize() {
97 expect![[r#"
98 Query {
99 query: Some(
100 FileGetInfo(
101 FileGetInfoQuery {
102 header: Some(
103 QueryHeader {
104 payment: None,
105 response_type: AnswerOnly,
106 },
107 ),
108 file_id: Some(
109 FileId {
110 shard_num: 0,
111 realm_num: 0,
112 file_num: 5005,
113 },
114 ),
115 },
116 ),
117 ),
118 }
119 "#]]
120 .assert_debug_eq(
121 &FileInfoQuery::new()
122 .file_id(FileId::new(0, 0, 5005))
123 .max_payment_amount(Hbar::from_tinybars(100_000))
124 .data
125 .to_query_protobuf(Default::default()),
126 )
127 }
128
129 #[test]
130 fn get_set_file_id() {
131 let mut query = FileContentsQuery::new();
132 query.file_id(FileId::new(0, 0, 5005));
133
134 assert_eq!(query.get_file_id(), Some(FileId::new(0, 0, 5005)));
135 }
136}