use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Event {
pub event_id: String,
pub origin_node_id: String,
#[serde(default = "default_epoch")]
pub origin_epoch: u32,
pub origin_seq: u64,
pub created_at_unix_ms: u64,
#[serde(default = "default_type", rename = "type")]
pub event_type: String,
pub bucket: String,
pub account: String,
pub amount: i64,
#[serde(default)]
pub note: Option<String>,
pub idempotency_nonce: String,
#[serde(default)]
pub void_ref: Option<String>,
#[serde(default)]
pub hold_amount: u64,
#[serde(default)]
pub hold_expires_at_unix_ms: u64,
}
fn default_epoch() -> u32 {
1
}
fn default_type() -> String {
"standard".to_string()
}
#[derive(Debug, Clone, Default)]
pub struct CreateEventOptions {
pub note: Option<String>,
pub idempotency_nonce: Option<String>,
pub max_overdraft: Option<u64>,
pub min_acks: Option<u32>,
pub ack_timeout_ms: Option<u64>,
pub hold_amount: Option<u64>,
pub hold_expires_at_unix_ms: Option<u64>,
}
#[derive(Debug, Clone, Serialize)]
pub(crate) struct CreateEventBody<'a> {
pub bucket: &'a str,
pub account: &'a str,
pub amount: i64,
#[serde(skip_serializing_if = "Option::is_none")]
pub note: Option<&'a str>,
pub idempotency_nonce: &'a str,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_overdraft: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub min_acks: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub ack_timeout_ms: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub hold_amount: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub hold_expires_at_unix_ms: Option<u64>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct CreateEventResult {
pub event: Event,
pub balance: i64,
pub available_balance: i64,
#[serde(default)]
pub deduplicated: bool,
#[serde(default)]
pub acks: AckInfo,
}
#[derive(Debug, Clone, Default, Deserialize)]
pub struct AckInfo {
#[serde(default)]
pub requested: u32,
#[serde(default)]
pub received: u32,
#[serde(default)]
pub timeout: bool,
}
#[derive(Debug, Clone, Deserialize)]
pub struct EventList {
pub events: Vec<Event>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct Balances {
pub accounts: Vec<AccountBalance>,
#[serde(default)]
pub total_balance: i64,
}
#[derive(Debug, Clone, Deserialize)]
pub struct AccountBalance {
pub bucket: String,
pub account: String,
pub balance: i64,
#[serde(default)]
pub available_balance: i64,
#[serde(default)]
pub active_hold_total: u64,
#[serde(default)]
pub event_count: u64,
}
#[derive(Debug, Clone, Deserialize)]
pub struct AccountDetail {
pub bucket: String,
pub account: String,
pub balance: i64,
#[serde(default)]
pub available_balance: i64,
#[serde(default)]
pub active_hold_total: u64,
#[serde(default)]
pub event_count: u64,
}
#[derive(Debug, Clone, Deserialize)]
pub struct EdgeInfo {
pub edge_id: String,
pub region: String,
pub base_url: String,
#[serde(default)]
pub ready: bool,
#[serde(default)]
pub reachable: bool,
#[serde(default)]
pub sync_gap: Option<u64>,
#[serde(default)]
pub overloaded: Option<bool>,
#[serde(default)]
pub healthy_nodes: usize,
#[serde(default)]
pub discovered_nodes: usize,
#[serde(default)]
pub best_node_rtt_ms: Option<u64>,
}
#[derive(Debug, Clone, Deserialize)]
pub(crate) struct EdgeDirectoryResponse {
pub edges: Vec<EdgeInfo>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct EdgeHealth {
#[serde(default)]
pub edge_id: Option<String>,
#[serde(default)]
pub region: Option<String>,
#[serde(default)]
pub base_url: Option<String>,
#[serde(default)]
pub ready: bool,
#[serde(default)]
pub discovered_nodes: usize,
#[serde(default)]
pub healthy_nodes: usize,
#[serde(default)]
pub best_node_rtt_ms: Option<u64>,
#[serde(default)]
pub sync_gap: Option<u64>,
#[serde(default)]
pub overloaded: Option<bool>,
#[serde(default)]
pub auth_enabled: bool,
}