use std::convert::TryFrom;
use chrono::{DateTime, Utc};
use crate::data::offset::DamlLedgerOffset;
use crate::data::{DamlError, DamlResult};
use crate::grpc_protobuf::com::daml::ledger::api::v2::topology_event::Event as TopologyEventKind;
use crate::grpc_protobuf::com::daml::ledger::api::v2::{
ParticipantAuthorizationAdded, ParticipantAuthorizationChanged, ParticipantAuthorizationOnboarding,
ParticipantAuthorizationRevoked, ParticipantPermission, TopologyEvent, TopologyTransaction,
};
use crate::util;
use crate::util::Required;
#[derive(Debug, Clone, Copy, Eq, PartialEq, Hash, Default)]
pub enum DamlParticipantPermission {
#[default]
Unspecified,
Submission,
Confirmation,
Observation,
}
impl From<ParticipantPermission> for DamlParticipantPermission {
fn from(p: ParticipantPermission) -> Self {
match p {
ParticipantPermission::Unspecified => Self::Unspecified,
ParticipantPermission::Submission => Self::Submission,
ParticipantPermission::Confirmation => Self::Confirmation,
ParticipantPermission::Observation => Self::Observation,
}
}
}
#[derive(Debug, Eq, PartialEq, Clone)]
pub struct DamlTopologyTransaction {
pub update_id: String,
pub offset: DamlLedgerOffset,
pub synchronizer_id: String,
pub record_time: DateTime<Utc>,
pub events: Vec<DamlTopologyEvent>,
}
impl TryFrom<TopologyTransaction> for DamlTopologyTransaction {
type Error = DamlError;
fn try_from(t: TopologyTransaction) -> DamlResult<Self> {
Ok(Self {
update_id: t.update_id,
offset: DamlLedgerOffset::new(t.offset),
synchronizer_id: t.synchronizer_id,
record_time: util::from_grpc_timestamp(&t.record_time.req()?)?,
events: t.events.into_iter().map(DamlTopologyEvent::try_from).collect::<DamlResult<_>>()?,
})
}
}
#[derive(Debug, Eq, PartialEq, Clone)]
pub enum DamlTopologyEvent {
ParticipantAuthorizationAdded(DamlParticipantAuthorizationAdded),
ParticipantAuthorizationChanged(DamlParticipantAuthorizationChanged),
ParticipantAuthorizationRevoked(DamlParticipantAuthorizationRevoked),
ParticipantAuthorizationOnboarding(DamlParticipantAuthorizationOnboarding),
}
impl TryFrom<TopologyEvent> for DamlTopologyEvent {
type Error = DamlError;
fn try_from(e: TopologyEvent) -> DamlResult<Self> {
Ok(match e.event.req()? {
TopologyEventKind::ParticipantAuthorizationAdded(e) => {
Self::ParticipantAuthorizationAdded(DamlParticipantAuthorizationAdded::try_from(e)?)
},
TopologyEventKind::ParticipantAuthorizationChanged(e) => {
Self::ParticipantAuthorizationChanged(DamlParticipantAuthorizationChanged::try_from(e)?)
},
TopologyEventKind::ParticipantAuthorizationRevoked(e) => {
Self::ParticipantAuthorizationRevoked(DamlParticipantAuthorizationRevoked::from(e))
},
TopologyEventKind::ParticipantAuthorizationOnboarding(e) => {
Self::ParticipantAuthorizationOnboarding(DamlParticipantAuthorizationOnboarding::try_from(e)?)
},
})
}
}
#[derive(Debug, Eq, PartialEq, Clone, Default)]
pub struct DamlParticipantAuthorizationAdded {
pub party_id: String,
pub participant_id: String,
pub permission: DamlParticipantPermission,
}
impl TryFrom<ParticipantAuthorizationAdded> for DamlParticipantAuthorizationAdded {
type Error = DamlError;
fn try_from(e: ParticipantAuthorizationAdded) -> DamlResult<Self> {
Ok(Self {
party_id: e.party_id,
participant_id: e.participant_id,
permission: DamlParticipantPermission::from(
ParticipantPermission::try_from(e.participant_permission).ok().req()?,
),
})
}
}
#[derive(Debug, Eq, PartialEq, Clone, Default)]
pub struct DamlParticipantAuthorizationChanged {
pub party_id: String,
pub participant_id: String,
pub permission: DamlParticipantPermission,
}
impl TryFrom<ParticipantAuthorizationChanged> for DamlParticipantAuthorizationChanged {
type Error = DamlError;
fn try_from(e: ParticipantAuthorizationChanged) -> DamlResult<Self> {
Ok(Self {
party_id: e.party_id,
participant_id: e.participant_id,
permission: DamlParticipantPermission::from(
ParticipantPermission::try_from(e.participant_permission).ok().req()?,
),
})
}
}
#[derive(Debug, Eq, PartialEq, Clone, Default)]
pub struct DamlParticipantAuthorizationRevoked {
pub party_id: String,
pub participant_id: String,
}
impl From<ParticipantAuthorizationRevoked> for DamlParticipantAuthorizationRevoked {
fn from(e: ParticipantAuthorizationRevoked) -> Self {
Self {
party_id: e.party_id,
participant_id: e.participant_id,
}
}
}
#[derive(Debug, Eq, PartialEq, Clone, Default)]
pub struct DamlParticipantAuthorizationOnboarding {
pub party_id: String,
pub participant_id: String,
pub permission: DamlParticipantPermission,
}
impl TryFrom<ParticipantAuthorizationOnboarding> for DamlParticipantAuthorizationOnboarding {
type Error = DamlError;
fn try_from(e: ParticipantAuthorizationOnboarding) -> DamlResult<Self> {
Ok(Self {
party_id: e.party_id,
participant_id: e.participant_id,
permission: DamlParticipantPermission::from(
ParticipantPermission::try_from(e.participant_permission).ok().req()?,
),
})
}
}