use bee_block::payload::milestone::option::dto::ReceiptMilestoneOptionDto;
use bee_ledger_types::Receipt;
#[cfg(feature = "peer")]
use bee_protocol_types::peer::Peer;
use serde::{Deserialize, Serialize};
#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
pub struct PeerDto {
pub id: String,
#[serde(rename = "multiAddresses")]
pub multi_addresses: Vec<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub alias: Option<String>,
pub relation: RelationDto,
pub connected: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub gossip: Option<GossipDto>,
}
#[cfg(feature = "peer")]
impl From<&Peer> for PeerDto {
fn from(peer: &Peer) -> Self {
PeerDto {
id: peer.id().to_string(),
alias: Some(peer.alias().to_string()),
multi_addresses: vec![peer.address().to_string()],
relation: {
if peer.relation().is_known() {
RelationDto::Known
} else if peer.relation().is_unknown() {
RelationDto::Unknown
} else {
RelationDto::Autopeered
}
},
connected: peer.is_connected(),
gossip: Some(GossipDto {
heartbeat: HeartbeatDto {
solid_milestone_index: *peer.solid_milestone_index(),
pruned_milestone_index: *peer.pruned_index(),
latest_milestone_index: *peer.latest_milestone_index(),
connected_peers: peer.connected_peers(),
synced_peers: peer.synced_peers(),
},
metrics: MetricsDto {
new_blocks: peer.metrics().new_blocks(),
received_blocks: peer.metrics().blocks_received(),
known_blocks: peer.metrics().known_blocks(),
received_block_requests: peer.metrics().block_requests_received(),
received_milestone_requests: peer.metrics().milestone_requests_received(),
received_heartbeats: peer.metrics().heartbeats_received(),
sent_blocks: peer.metrics().blocks_sent(),
sent_block_requests: peer.metrics().block_requests_sent(),
sent_milestone_requests: peer.metrics().milestone_requests_sent(),
sent_heartbeats: peer.metrics().heartbeats_sent(),
dropped_packets: 0,
},
}),
}
}
}
#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize, Default)]
pub struct GossipDto {
pub heartbeat: HeartbeatDto,
pub metrics: MetricsDto,
}
#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
pub enum RelationDto {
#[serde(rename = "known")]
Known,
#[serde(rename = "unknown")]
Unknown,
#[serde(rename = "autopeered")]
Autopeered,
}
#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize)]
pub struct HeartbeatDto {
#[serde(rename = "solidMilestoneIndex")]
pub solid_milestone_index: u32,
#[serde(rename = "prunedMilestoneIndex")]
pub pruned_milestone_index: u32,
#[serde(rename = "latestMilestoneIndex")]
pub latest_milestone_index: u32,
#[serde(rename = "connectedPeers")]
pub connected_peers: u8,
#[serde(rename = "syncedPeers")]
pub synced_peers: u8,
}
#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize)]
pub struct MetricsDto {
#[serde(rename = "newBlocks")]
pub new_blocks: u64,
#[serde(rename = "receivedBlocks")]
pub received_blocks: u64,
#[serde(rename = "knownBlocks")]
pub known_blocks: u64,
#[serde(rename = "receivedBlockRequests")]
pub received_block_requests: u64,
#[serde(rename = "receivedMilestoneRequests")]
pub received_milestone_requests: u64,
#[serde(rename = "receivedHeartbeats")]
pub received_heartbeats: u64,
#[serde(rename = "sentBlocks")]
pub sent_blocks: u64,
#[serde(rename = "sentBlockRequests")]
pub sent_block_requests: u64,
#[serde(rename = "sentMilestoneRequests")]
pub sent_milestone_requests: u64,
#[serde(rename = "sentHeartbeats")]
pub sent_heartbeats: u64,
#[serde(rename = "droppedPackets")]
pub dropped_packets: u64,
}
#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
pub struct ReceiptDto {
pub receipt: ReceiptMilestoneOptionDto,
#[serde(rename = "milestoneIndex")]
pub milestone_index: u32,
}
impl From<Receipt> for ReceiptDto {
fn from(value: Receipt) -> Self {
ReceiptDto {
receipt: value.inner().into(),
milestone_index: **value.included_in(),
}
}
}
#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
pub enum LedgerInclusionStateDto {
#[serde(rename = "conflicting")]
Conflicting,
#[serde(rename = "included")]
Included,
#[serde(rename = "noTransaction")]
NoTransaction,
}