use std::convert::TryFrom;
use std::time::Duration;
use chrono::{DateTime, Utc};
use crate::data::command::DamlCommand;
use crate::data::identifier::DamlIdentifier;
use crate::data::value::DamlValue;
use crate::data::{DamlError, DamlResult};
use crate::grpc_protobuf::com::daml::ledger::api::v2::commands::DeduplicationPeriod;
use crate::grpc_protobuf::com::daml::ledger::api::v2::{Command, Commands, DisclosedContract, PrefetchContractKey};
use crate::util;
#[derive(Debug, Eq, PartialEq, Clone)]
pub struct DamlCommands {
pub workflow_id: String,
pub user_id: String,
pub command_id: String,
pub submission_id: String,
pub act_as: Vec<String>,
pub read_as: Vec<String>,
pub commands: Vec<DamlCommand>,
pub deduplication_period: Option<DamlCommandsDeduplicationPeriod>,
pub min_ledger_time: Option<DamlMinLedgerTime>,
pub disclosed_contracts: Vec<DamlDisclosedContract>,
pub synchronizer_id: String,
pub package_id_selection_preference: Vec<String>,
pub prefetch_contract_keys: Vec<DamlPrefetchContractKey>,
pub taps_max_passes: Option<u32>,
}
impl DamlCommands {
pub fn new(
user_id: impl Into<String>,
command_id: impl Into<String>,
act_as: impl Into<Vec<String>>,
commands: impl Into<Vec<DamlCommand>>,
) -> Self {
Self {
workflow_id: String::new(),
user_id: user_id.into(),
command_id: command_id.into(),
submission_id: String::new(),
act_as: act_as.into(),
read_as: Vec::new(),
commands: commands.into(),
deduplication_period: None,
min_ledger_time: None,
disclosed_contracts: Vec::new(),
synchronizer_id: String::new(),
package_id_selection_preference: Vec::new(),
prefetch_contract_keys: Vec::new(),
taps_max_passes: None,
}
}
}
impl TryFrom<DamlCommands> for Commands {
type Error = DamlError;
fn try_from(d: DamlCommands) -> DamlResult<Commands> {
Ok(Commands {
workflow_id: d.workflow_id,
user_id: d.user_id,
command_id: d.command_id,
submission_id: d.submission_id,
act_as: d.act_as,
read_as: d.read_as,
commands: d.commands.into_iter().map(Command::from).collect(),
min_ledger_time_abs: match &d.min_ledger_time {
Some(DamlMinLedgerTime::Absolute(ts)) => Some(util::to_grpc_timestamp(*ts)?),
_ => None,
},
min_ledger_time_rel: match &d.min_ledger_time {
Some(DamlMinLedgerTime::Relative(dur)) => Some(util::to_grpc_duration(dur)?),
_ => None,
},
deduplication_period: d.deduplication_period.map(DeduplicationPeriod::try_from).transpose()?,
disclosed_contracts: d.disclosed_contracts.into_iter().map(DisclosedContract::from).collect(),
synchronizer_id: d.synchronizer_id,
package_id_selection_preference: d.package_id_selection_preference,
prefetch_contract_keys: d
.prefetch_contract_keys
.into_iter()
.map(PrefetchContractKey::try_from)
.collect::<DamlResult<Vec<_>>>()?,
taps_max_passes: d.taps_max_passes,
})
}
}
#[derive(Debug, Eq, PartialEq, Clone)]
pub enum DamlMinLedgerTime {
Absolute(DateTime<Utc>),
Relative(Duration),
}
#[derive(Debug, Eq, PartialEq, Clone)]
pub enum DamlCommandsDeduplicationPeriod {
DeduplicationOffset(i64),
DeduplicationDuration(Duration),
}
impl TryFrom<DamlCommandsDeduplicationPeriod> for DeduplicationPeriod {
type Error = DamlError;
fn try_from(period: DamlCommandsDeduplicationPeriod) -> DamlResult<Self> {
Ok(match period {
DamlCommandsDeduplicationPeriod::DeduplicationOffset(offset) => {
DeduplicationPeriod::DeduplicationOffset(offset)
},
DamlCommandsDeduplicationPeriod::DeduplicationDuration(dur) => {
DeduplicationPeriod::DeduplicationDuration(util::to_grpc_duration(&dur)?)
},
})
}
}
#[derive(Debug, Eq, PartialEq, Clone, Default)]
pub struct DamlDisclosedContract {
pub template_id: Option<DamlIdentifier>,
pub contract_id: String,
pub created_event_blob: Vec<u8>,
pub synchronizer_id: String,
}
impl From<DamlDisclosedContract> for DisclosedContract {
fn from(d: DamlDisclosedContract) -> Self {
Self {
template_id: d.template_id.map(Into::into),
contract_id: d.contract_id,
created_event_blob: d.created_event_blob,
synchronizer_id: d.synchronizer_id,
}
}
}
#[derive(Debug, Eq, PartialEq, Clone)]
pub struct DamlPrefetchContractKey {
pub template_id: DamlIdentifier,
pub contract_key: DamlValue,
pub limit: Option<u32>,
}
impl TryFrom<DamlPrefetchContractKey> for PrefetchContractKey {
type Error = DamlError;
fn try_from(p: DamlPrefetchContractKey) -> DamlResult<Self> {
Ok(Self {
template_id: Some(p.template_id.into()),
contract_key: Some(p.contract_key.into()),
limit: p.limit,
})
}
}