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}