sui_rpc_api/grpc/v2/move_package_service/
mod.rs

1// Copyright (c) Mysten Labs, Inc.
2// SPDX-License-Identifier: Apache-2.0
3
4use crate::{ErrorReason, Result, RpcError, RpcService};
5use sui_rpc::proto::google::rpc::bad_request::FieldViolation;
6use sui_rpc::proto::sui::rpc::v2::move_package_service_server::MovePackageService;
7use sui_rpc::proto::sui::rpc::v2::{
8    GetDatatypeRequest, GetDatatypeResponse, GetFunctionRequest, GetFunctionResponse,
9    GetPackageRequest, GetPackageResponse, ListPackageVersionsRequest, ListPackageVersionsResponse,
10};
11use sui_types::{base_types::ObjectID, move_package::MovePackage};
12
13mod conversions;
14mod get_datatype;
15mod get_function;
16mod get_package;
17mod list_package_versions;
18
19#[tonic::async_trait]
20impl MovePackageService for RpcService {
21    async fn get_package(
22        &self,
23        request: tonic::Request<GetPackageRequest>,
24    ) -> Result<tonic::Response<GetPackageResponse>, tonic::Status> {
25        get_package::get_package(self, request.into_inner())
26            .map(tonic::Response::new)
27            .map_err(Into::into)
28    }
29
30    async fn get_datatype(
31        &self,
32        request: tonic::Request<GetDatatypeRequest>,
33    ) -> Result<tonic::Response<GetDatatypeResponse>, tonic::Status> {
34        get_datatype::get_datatype(self, request.into_inner())
35            .map(tonic::Response::new)
36            .map_err(Into::into)
37    }
38
39    async fn get_function(
40        &self,
41        request: tonic::Request<GetFunctionRequest>,
42    ) -> Result<tonic::Response<GetFunctionResponse>, tonic::Status> {
43        get_function::get_function(self, request.into_inner())
44            .map(tonic::Response::new)
45            .map_err(Into::into)
46    }
47
48    async fn list_package_versions(
49        &self,
50        request: tonic::Request<ListPackageVersionsRequest>,
51    ) -> Result<tonic::Response<ListPackageVersionsResponse>, tonic::Status> {
52        list_package_versions::list_package_versions(self, request.into_inner())
53            .map(tonic::Response::new)
54            .map_err(Into::into)
55    }
56}
57
58pub(crate) fn load_package(service: &RpcService, package_id_str: &str) -> Result<MovePackage> {
59    let package_id = package_id_str.parse::<ObjectID>().map_err(|e| {
60        FieldViolation::new("package_id")
61            .with_description(format!("invalid package_id: {}", e))
62            .with_reason(ErrorReason::FieldInvalid)
63    })?;
64
65    let object = service
66        .reader
67        .inner()
68        .get_object(&package_id)
69        .ok_or_else(RpcError::not_found)?;
70
71    let inner = object.into_inner();
72    inner
73        .data
74        .try_into_package()
75        .ok_or_else(|| RpcError::new(tonic::Code::InvalidArgument, "object is not a package"))
76}