Skip to main content

sui_rpc_api/grpc/v2/move_package_service/
get_package.rs

1// Copyright (c) Mysten Labs, Inc.
2// SPDX-License-Identifier: Apache-2.0
3
4use crate::{
5    ErrorReason, Result, RpcService,
6    grpc::v2::move_package_service::{
7        conversions::{convert_error, convert_module},
8        load_package,
9    },
10};
11use sui_rpc::proto::google::rpc::bad_request::FieldViolation;
12use sui_rpc::proto::sui::rpc::v2::{GetPackageRequest, GetPackageResponse, Package};
13use sui_types::move_package::MovePackage;
14
15#[tracing::instrument(skip(service))]
16pub fn get_package(service: &RpcService, request: GetPackageRequest) -> Result<GetPackageResponse> {
17    let package_id_str = request.package_id.as_ref().ok_or_else(|| {
18        FieldViolation::new("package_id")
19            .with_description("missing package_id")
20            .with_reason(ErrorReason::FieldMissing)
21    })?;
22
23    let package = load_package(service, package_id_str)?;
24    get_package_response(&package)
25}
26
27/// Build a `GetPackage` response from an already-loaded package. Shared with other implementors
28/// of `MovePackageService` (e.g. sui-kv-rpc) that load packages from a different backend.
29pub fn get_package_response(package: &MovePackage) -> Result<GetPackageResponse> {
30    let package_id = package.id();
31
32    let resolved_package =
33        sui_package_resolver::Package::read_from_package(package).map_err(convert_error)?;
34
35    let modules: Vec<_> = resolved_package
36        .modules()
37        .iter()
38        .map(|(module_name, resolver_module)| {
39            convert_module(module_name, resolver_module, &package_id)
40        })
41        .collect::<Result<Vec<_>>>()?;
42
43    let mut message = Package::default();
44    message.storage_id = Some(package_id.to_canonical_string(true));
45    message.original_id = Some(package.original_package_id().to_canonical_string(true));
46    message.version = Some(package.version().value());
47    message.modules = modules;
48
49    Ok(GetPackageResponse::new(message))
50}