Skip to main content

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
13pub mod conversions;
14mod get_datatype;
15mod get_function;
16mod get_package;
17mod list_package_versions;
18
19pub use get_datatype::get_datatype_response;
20pub use get_function::get_function_response;
21pub use get_package::get_package_response;
22pub use list_package_versions::PageToken;
23
24#[tonic::async_trait]
25impl MovePackageService for RpcService {
26    async fn get_package(
27        &self,
28        request: tonic::Request<GetPackageRequest>,
29    ) -> Result<tonic::Response<GetPackageResponse>, tonic::Status> {
30        get_package::get_package(self, request.into_inner())
31            .map(tonic::Response::new)
32            .map_err(Into::into)
33    }
34
35    async fn get_datatype(
36        &self,
37        request: tonic::Request<GetDatatypeRequest>,
38    ) -> Result<tonic::Response<GetDatatypeResponse>, tonic::Status> {
39        get_datatype::get_datatype(self, request.into_inner())
40            .map(tonic::Response::new)
41            .map_err(Into::into)
42    }
43
44    async fn get_function(
45        &self,
46        request: tonic::Request<GetFunctionRequest>,
47    ) -> Result<tonic::Response<GetFunctionResponse>, tonic::Status> {
48        get_function::get_function(self, request.into_inner())
49            .map(tonic::Response::new)
50            .map_err(Into::into)
51    }
52
53    async fn list_package_versions(
54        &self,
55        request: tonic::Request<ListPackageVersionsRequest>,
56    ) -> Result<tonic::Response<ListPackageVersionsResponse>, tonic::Status> {
57        list_package_versions::list_package_versions(self, request.into_inner())
58            .map(tonic::Response::new)
59            .map_err(Into::into)
60    }
61}
62
63pub(crate) fn load_package(service: &RpcService, package_id_str: &str) -> Result<MovePackage> {
64    let package_id = package_id_str.parse::<ObjectID>().map_err(|e| {
65        FieldViolation::new("package_id")
66            .with_description(format!("invalid package_id: {}", e))
67            .with_reason(ErrorReason::FieldInvalid)
68    })?;
69
70    let object = service
71        .reader
72        .inner()
73        .get_object(&package_id)
74        .ok_or_else(RpcError::not_found)?;
75
76    let inner = object.into_inner();
77    inner
78        .data
79        .try_into_package()
80        .ok_or_else(|| RpcError::new(tonic::Code::InvalidArgument, "object is not a package"))
81}