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
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}