daml_grpc/service/
daml_package_service.rs1use std::convert::TryFrom;
2use std::fmt::Debug;
3
4use tonic::transport::Channel;
5use tracing::{instrument, trace};
6
7use crate::data::package::DamlPackage;
8use crate::data::package::DamlPackageStatus;
9use crate::data::DamlResult;
10use crate::grpc_protobuf::com::daml::ledger::api::v1::package_service_client::PackageServiceClient;
11use crate::grpc_protobuf::com::daml::ledger::api::v1::{
12 GetPackageRequest, GetPackageStatusRequest, ListPackagesRequest, PackageStatus,
13};
14use crate::service::common::make_request;
15use crate::util::Required;
16
17#[derive(Debug)]
19pub struct DamlPackageService<'a> {
20 channel: Channel,
21 ledger_id: &'a str,
22 auth_token: Option<&'a str>,
23}
24
25impl<'a> DamlPackageService<'a> {
26 pub fn new(channel: Channel, ledger_id: &'a str, auth_token: Option<&'a str>) -> Self {
27 Self {
28 channel,
29 ledger_id,
30 auth_token,
31 }
32 }
33
34 pub fn with_token(self, auth_token: &'a str) -> Self {
36 Self {
37 auth_token: Some(auth_token),
38 ..self
39 }
40 }
41
42 pub fn with_ledger_id(self, ledger_id: &'a str) -> Self {
44 Self {
45 ledger_id,
46 ..self
47 }
48 }
49
50 #[instrument(skip(self))]
52 pub async fn list_packages(&self) -> DamlResult<Vec<String>> {
53 let payload = ListPackagesRequest {
54 ledger_id: self.ledger_id.to_owned(),
55 };
56 trace!(payload = ?payload, token = ?self.auth_token);
57 let response = self.client().list_packages(make_request(payload, self.auth_token)?).await?.into_inner();
58 trace!(?response);
59 Ok(response.package_ids)
60 }
61
62 #[instrument(skip(self))]
64 pub async fn get_package(&self, package_id: impl Into<String> + Debug) -> DamlResult<DamlPackage> {
65 let payload = GetPackageRequest {
66 ledger_id: self.ledger_id.to_owned(),
67 package_id: package_id.into(),
68 };
69 trace!(payload = ?payload, token = ?self.auth_token);
70 let response = self.client().get_package(make_request(payload, self.auth_token)?).await?.into_inner();
71 trace!(?response);
72 DamlPackage::try_from(response)
73 }
74
75 #[instrument(skip(self))]
77 pub async fn get_package_status(&self, package_id: impl Into<String> + Debug) -> DamlResult<DamlPackageStatus> {
78 let payload = GetPackageStatusRequest {
79 ledger_id: self.ledger_id.to_owned(),
80 package_id: package_id.into(),
81 };
82 trace!(payload = ?payload, token = ?self.auth_token);
83 let response = self.client().get_package_status(make_request(payload, self.auth_token)?).await?.into_inner();
84 trace!(?response);
85 Ok(DamlPackageStatus::from(PackageStatus::from_i32(response.package_status).req()?))
86 }
87
88 fn client(&self) -> PackageServiceClient<Channel> {
89 PackageServiceClient::new(self.channel.clone())
90 }
91}