use rustlavel_core::Json;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum TransferKind {
TopUp,
Consume,
Capture,
Expire,
Adjust,
Refund,
}
impl TransferKind {
pub fn as_str(self) -> &'static str {
match self {
TransferKind::TopUp => "topup",
TransferKind::Consume => "consume",
TransferKind::Capture => "capture",
TransferKind::Expire => "expire",
TransferKind::Adjust => "adjust",
TransferKind::Refund => "refund",
}
}
pub fn parse(text: &str) -> Option<TransferKind> {
Some(match text {
"topup" => TransferKind::TopUp,
"consume" => TransferKind::Consume,
"capture" => TransferKind::Capture,
"expire" => TransferKind::Expire,
"adjust" => TransferKind::Adjust,
"refund" => TransferKind::Refund,
_ => return None,
})
}
}
#[derive(Debug, Clone, PartialEq)]
pub struct Transfer {
pub id: String,
pub reference: String,
pub kind: TransferKind,
pub from_account: String,
pub to_account: String,
pub amount: i64,
pub created_at: u64,
pub metadata: Json,
}
impl Transfer {
pub fn to_json(&self) -> Json {
Json::object([
("id", Json::from(self.id.as_str())),
("reference", Json::from(self.reference.as_str())),
("kind", Json::from(self.kind.as_str())),
("from", Json::from(self.from_account.as_str())),
("to", Json::from(self.to_account.as_str())),
("amount", Json::from(self.amount)),
("created_at", Json::from(self.created_at as i64)),
("metadata", self.metadata.clone()),
])
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Entry {
pub id: i64,
pub transfer_id: String,
pub account_id: String,
pub amount: i64,
pub balance_after: i64,
pub kind: TransferKind,
pub reference: String,
pub created_at: u64,
}
impl Entry {
pub fn to_json(&self) -> Json {
Json::object([
("id", Json::from(self.id)),
("transfer_id", Json::from(self.transfer_id.as_str())),
("amount", Json::from(self.amount)),
("balance_after", Json::from(self.balance_after)),
("kind", Json::from(self.kind.as_str())),
("reference", Json::from(self.reference.as_str())),
("created_at", Json::from(self.created_at as i64)),
])
}
}