use std::convert::TryFrom;
use chrono::{DateTime, Utc};
use crate::data::event::DamlCreatedEvent;
use crate::data::identifier::DamlIdentifier;
use crate::data::offset::DamlLedgerOffset;
use crate::data::{DamlError, DamlResult};
use crate::grpc_protobuf::com::daml::ledger::api::v2::reassignment_command::Command as ReassignmentCommandKind;
use crate::grpc_protobuf::com::daml::ledger::api::v2::reassignment_event::Event as ReassignmentEventKind;
use crate::grpc_protobuf::com::daml::ledger::api::v2::{
AssignCommand, AssignedEvent, Reassignment, ReassignmentCommand, ReassignmentCommands, ReassignmentEvent,
UnassignCommand, UnassignedEvent,
};
use crate::util;
use crate::util::Required;
#[derive(Debug, Eq, PartialEq, Clone)]
pub struct DamlReassignment {
pub update_id: String,
pub command_id: String,
pub workflow_id: String,
pub offset: DamlLedgerOffset,
pub events: Vec<DamlReassignmentEvent>,
pub record_time: DateTime<Utc>,
pub synchronizer_id: String,
pub paid_traffic_cost: Option<i64>,
}
impl TryFrom<Reassignment> for DamlReassignment {
type Error = DamlError;
fn try_from(r: Reassignment) -> DamlResult<Self> {
Ok(Self {
update_id: r.update_id,
command_id: r.command_id,
workflow_id: r.workflow_id,
offset: DamlLedgerOffset::new(r.offset),
events: r.events.into_iter().map(DamlReassignmentEvent::try_from).collect::<DamlResult<_>>()?,
record_time: util::from_grpc_timestamp(&r.record_time.req()?)?,
synchronizer_id: r.synchronizer_id,
paid_traffic_cost: r.paid_traffic_cost,
})
}
}
#[derive(Debug, Eq, PartialEq, Clone)]
pub enum DamlReassignmentEvent {
Unassigned(Box<DamlUnassignedEvent>),
Assigned(Box<DamlAssignedEvent>),
}
impl TryFrom<ReassignmentEvent> for DamlReassignmentEvent {
type Error = DamlError;
fn try_from(e: ReassignmentEvent) -> DamlResult<Self> {
Ok(match e.event.req()? {
ReassignmentEventKind::Unassigned(e) => Self::Unassigned(Box::new(DamlUnassignedEvent::try_from(e)?)),
ReassignmentEventKind::Assigned(e) => Self::Assigned(Box::new(DamlAssignedEvent::try_from(e)?)),
})
}
}
#[derive(Debug, Eq, PartialEq, Clone)]
pub struct DamlUnassignedEvent {
pub reassignment_id: String,
pub contract_id: String,
pub template_id: DamlIdentifier,
pub source: String,
pub target: String,
pub submitter: String,
pub reassignment_counter: u64,
pub assignment_exclusivity: Option<DateTime<Utc>>,
pub witness_parties: Vec<String>,
pub package_name: String,
pub offset: DamlLedgerOffset,
pub node_id: i32,
}
impl TryFrom<UnassignedEvent> for DamlUnassignedEvent {
type Error = DamlError;
fn try_from(e: UnassignedEvent) -> DamlResult<Self> {
Ok(Self {
reassignment_id: e.reassignment_id,
contract_id: e.contract_id,
template_id: DamlIdentifier::from(e.template_id.req()?),
source: e.source,
target: e.target,
submitter: e.submitter,
reassignment_counter: e.reassignment_counter,
assignment_exclusivity: e.assignment_exclusivity.as_ref().map(util::from_grpc_timestamp).transpose()?,
witness_parties: e.witness_parties,
package_name: e.package_name,
offset: DamlLedgerOffset::new(e.offset),
node_id: e.node_id,
})
}
}
#[derive(Debug, Eq, PartialEq, Clone)]
pub struct DamlAssignedEvent {
pub source: String,
pub target: String,
pub reassignment_id: String,
pub submitter: String,
pub reassignment_counter: u64,
pub created_event: DamlCreatedEvent,
}
impl TryFrom<AssignedEvent> for DamlAssignedEvent {
type Error = DamlError;
fn try_from(e: AssignedEvent) -> DamlResult<Self> {
Ok(Self {
source: e.source,
target: e.target,
reassignment_id: e.reassignment_id,
submitter: e.submitter,
reassignment_counter: e.reassignment_counter,
created_event: DamlCreatedEvent::try_from(e.created_event.req()?)?,
})
}
}
#[derive(Debug, Clone, Eq, PartialEq)]
pub struct DamlReassignmentCommands {
pub workflow_id: String,
pub user_id: String,
pub command_id: String,
pub submitter: String,
pub submission_id: String,
pub commands: Vec<DamlReassignmentCommand>,
}
impl From<DamlReassignmentCommands> for ReassignmentCommands {
fn from(c: DamlReassignmentCommands) -> Self {
Self {
workflow_id: c.workflow_id,
user_id: c.user_id,
command_id: c.command_id,
submitter: c.submitter,
submission_id: c.submission_id,
commands: c.commands.into_iter().map(Into::into).collect(),
}
}
}
#[derive(Debug, Clone, Eq, PartialEq)]
pub enum DamlReassignmentCommand {
Unassign(DamlUnassignCommand),
Assign(DamlAssignCommand),
}
impl From<DamlReassignmentCommand> for ReassignmentCommand {
fn from(c: DamlReassignmentCommand) -> Self {
Self {
command: Some(match c {
DamlReassignmentCommand::Unassign(u) => ReassignmentCommandKind::UnassignCommand(u.into()),
DamlReassignmentCommand::Assign(a) => ReassignmentCommandKind::AssignCommand(a.into()),
}),
}
}
}
#[derive(Debug, Clone, Eq, PartialEq, Default)]
pub struct DamlUnassignCommand {
pub contract_id: String,
pub source: String,
pub target: String,
}
impl From<DamlUnassignCommand> for UnassignCommand {
fn from(c: DamlUnassignCommand) -> Self {
Self {
contract_id: c.contract_id,
source: c.source,
target: c.target,
}
}
}
#[derive(Debug, Clone, Eq, PartialEq, Default)]
pub struct DamlAssignCommand {
pub reassignment_id: String,
pub source: String,
pub target: String,
}
impl From<DamlAssignCommand> for AssignCommand {
fn from(c: DamlAssignCommand) -> Self {
Self {
reassignment_id: c.reassignment_id,
source: c.source,
target: c.target,
}
}
}