sui_rpc_api/grpc/v2beta2/move_package_service/
mod.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
// Copyright (c) Mysten Labs, Inc.
// SPDX-License-Identifier: Apache-2.0

use crate::proto::google::rpc::bad_request::FieldViolation;
use crate::proto::rpc::v2beta2::move_package_service_server::MovePackageService;
use crate::proto::rpc::v2beta2::{
    GetDatatypeRequest, GetDatatypeResponse, GetFunctionRequest, GetFunctionResponse,
    GetPackageRequest, GetPackageResponse, ListPackageVersionsRequest, ListPackageVersionsResponse,
};
use crate::{ErrorReason, Result, RpcError, RpcService};
use sui_types::{base_types::ObjectID, move_package::MovePackage};

mod conversions;
mod get_datatype;
mod get_function;
mod get_package;
mod list_package_versions;

#[tonic::async_trait]
impl MovePackageService for RpcService {
    async fn get_package(
        &self,
        request: tonic::Request<GetPackageRequest>,
    ) -> Result<tonic::Response<GetPackageResponse>, tonic::Status> {
        get_package::get_package(self, request.into_inner())
            .map(tonic::Response::new)
            .map_err(Into::into)
    }

    async fn get_datatype(
        &self,
        request: tonic::Request<GetDatatypeRequest>,
    ) -> Result<tonic::Response<GetDatatypeResponse>, tonic::Status> {
        get_datatype::get_datatype(self, request.into_inner())
            .map(tonic::Response::new)
            .map_err(Into::into)
    }

    async fn get_function(
        &self,
        request: tonic::Request<GetFunctionRequest>,
    ) -> Result<tonic::Response<GetFunctionResponse>, tonic::Status> {
        get_function::get_function(self, request.into_inner())
            .map(tonic::Response::new)
            .map_err(Into::into)
    }

    async fn list_package_versions(
        &self,
        request: tonic::Request<ListPackageVersionsRequest>,
    ) -> Result<tonic::Response<ListPackageVersionsResponse>, tonic::Status> {
        list_package_versions::list_package_versions(self, request.into_inner())
            .map(tonic::Response::new)
            .map_err(Into::into)
    }
}

pub(crate) fn load_package(service: &RpcService, package_id_str: &str) -> Result<MovePackage> {
    let package_id = package_id_str.parse::<ObjectID>().map_err(|e| {
        FieldViolation::new("package_id")
            .with_description(format!("invalid package_id: {}", e))
            .with_reason(ErrorReason::FieldInvalid)
    })?;

    let object = service
        .reader
        .inner()
        .get_object(&package_id)
        .ok_or_else(RpcError::not_found)?;

    let inner = object.into_inner();
    inner
        .data
        .try_into_package()
        .ok_or_else(|| RpcError::new(tonic::Code::InvalidArgument, "object is not a package"))
}