iota_grpc_client/api/move_package/package_versions.rs
1// Copyright (c) 2026 IOTA Stiftung
2// SPDX-License-Identifier: Apache-2.0
3
4//! High-level API for listing package versions.
5
6use iota_grpc_types::v1::move_package_service::{
7 ListPackageVersionsRequest, PackageVersion,
8 move_package_service_client::MovePackageServiceClient,
9};
10use iota_sdk_types::ObjectId;
11
12use crate::{
13 Client, InterceptedChannel,
14 api::{define_list_query, proto_object_id},
15};
16
17define_list_query! {
18 /// Builder for listing versions of a Move package.
19 ///
20 /// Created by [`Client::list_package_versions`]. Await directly for a
21 /// single page, or call [`.collect(limit)`](Self::collect) to
22 /// auto-paginate.
23 pub struct ListPackageVersionsQuery {
24 service_client: MovePackageServiceClient<InterceptedChannel>,
25 request: ListPackageVersionsRequest,
26 item: PackageVersion,
27 rpc_method: list_package_versions,
28 items_field: versions,
29 }
30}
31
32impl Client {
33 /// List all versions of a Move package.
34 ///
35 /// Returns a query builder. Await it directly for a single page
36 /// (with access to `next_page_token`), or call `.collect(limit)` to
37 /// auto-paginate through all results.
38 ///
39 /// # Parameters
40 ///
41 /// - `package_id` - The object ID of any version of the package.
42 /// - `page_size` - Optional maximum number of versions per page.
43 /// - `page_token` - Optional continuation token from a previous page.
44 ///
45 /// # Examples
46 ///
47 /// Single page:
48 /// ```no_run
49 /// # use iota_grpc_client::Client;
50 /// # use iota_sdk_types::ObjectId;
51 /// # async fn example() -> Result<(), Box<dyn std::error::Error>> {
52 /// let client = Client::connect("http://localhost:9000").await?;
53 /// let package_id: ObjectId = "0x2".parse()?;
54 ///
55 /// let page = client.list_package_versions(package_id, None, None).await?;
56 /// for version in &page.body().items {
57 /// println!("Package version: {:?}", version);
58 /// }
59 /// # Ok(())
60 /// # }
61 /// ```
62 ///
63 /// Auto-paginate:
64 /// ```no_run
65 /// # use iota_grpc_client::Client;
66 /// # use iota_sdk_types::ObjectId;
67 /// # async fn example() -> Result<(), Box<dyn std::error::Error>> {
68 /// let client = Client::connect("http://localhost:9000").await?;
69 /// let package_id: ObjectId = "0x2".parse()?;
70 ///
71 /// let all = client
72 /// .list_package_versions(package_id, Some(50), None)
73 /// .collect(None)
74 /// .await?;
75 /// for version in all.body() {
76 /// println!("Package version: {:?}", version);
77 /// }
78 /// # Ok(())
79 /// # }
80 /// ```
81 pub fn list_package_versions(
82 &self,
83 package_id: ObjectId,
84 page_size: Option<u32>,
85 page_token: Option<prost::bytes::Bytes>,
86 ) -> ListPackageVersionsQuery {
87 let base_request =
88 ListPackageVersionsRequest::default().with_package_id(proto_object_id(package_id));
89
90 ListPackageVersionsQuery::new(
91 self.move_package_service_client(),
92 base_request,
93 self.max_decoding_message_size(),
94 page_size,
95 page_token,
96 )
97 }
98}