sui_rpc_api/grpc/v2/move_package_service/
get_package.rs1use 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
27pub 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}