use std::convert::TryFrom;
use std::fmt::Debug;
use tonic::transport::Channel;
use tracing::{instrument, trace};
use crate::data::DamlResult;
use crate::data::package::{
DamlPackage, DamlPackageMetadataFilter, DamlPackageStatus, DamlTopologyStateFilter, DamlVettedPackages,
DamlVettedPackagesPage,
};
use crate::grpc_protobuf::com::daml::ledger::api::v2::package_service_client::PackageServiceClient;
use crate::grpc_protobuf::com::daml::ledger::api::v2::{
GetPackageRequest, GetPackageStatusRequest, ListPackagesRequest, ListVettedPackagesRequest, PackageStatus,
};
use crate::service::common::make_request;
use crate::util::Required;
#[derive(Debug)]
pub struct DamlPackageService<'a> {
channel: Channel,
auth_token: Option<&'a str>,
}
impl<'a> DamlPackageService<'a> {
pub fn new(channel: Channel, auth_token: Option<&'a str>) -> Self {
Self {
channel,
auth_token,
}
}
pub fn with_token(self, auth_token: &'a str) -> Self {
Self {
auth_token: Some(auth_token),
..self
}
}
#[instrument(skip(self))]
pub async fn list_packages(&self) -> DamlResult<Vec<String>> {
let payload = ListPackagesRequest {};
trace!(payload = ?payload, token = ?self.auth_token);
let response = self.client().list_packages(make_request(payload, self.auth_token)?).await?.into_inner();
trace!(?response);
Ok(response.package_ids)
}
#[instrument(skip(self))]
pub async fn get_package(&self, package_id: impl Into<String> + Debug) -> DamlResult<DamlPackage> {
let payload = GetPackageRequest {
package_id: package_id.into(),
};
trace!(payload = ?payload, token = ?self.auth_token);
let response = self.client().get_package(make_request(payload, self.auth_token)?).await?.into_inner();
trace!(?response);
DamlPackage::try_from(response)
}
#[instrument(skip(self))]
pub async fn get_package_status(&self, package_id: impl Into<String> + Debug) -> DamlResult<DamlPackageStatus> {
let payload = GetPackageStatusRequest {
package_id: package_id.into(),
};
trace!(payload = ?payload, token = ?self.auth_token);
let response = self.client().get_package_status(make_request(payload, self.auth_token)?).await?.into_inner();
trace!(?response);
Ok(DamlPackageStatus::from(PackageStatus::try_from(response.package_status).ok().req()?))
}
#[instrument(skip(self))]
pub async fn list_vetted_packages(
&self,
package_metadata_filter: Option<DamlPackageMetadataFilter>,
topology_state_filter: Option<DamlTopologyStateFilter>,
page_token: impl Into<String> + Debug,
page_size: u32,
) -> DamlResult<DamlVettedPackagesPage> {
let payload = ListVettedPackagesRequest {
package_metadata_filter: package_metadata_filter.map(Into::into),
topology_state_filter: topology_state_filter.map(Into::into),
page_token: page_token.into(),
page_size,
};
trace!(payload = ?payload, token = ?self.auth_token);
let response = self.client().list_vetted_packages(make_request(payload, self.auth_token)?).await?.into_inner();
trace!(?response);
Ok(DamlVettedPackagesPage {
vetted_packages: response
.vetted_packages
.into_iter()
.map(DamlVettedPackages::try_from)
.collect::<DamlResult<Vec<_>>>()?,
next_page_token: response.next_page_token,
})
}
fn client(&self) -> PackageServiceClient<Channel> {
PackageServiceClient::new(self.channel.clone())
}
}