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