lightspark/objects/
lightning_transaction.rs1use super::incoming_payment::IncomingPayment;
3use super::outgoing_payment::OutgoingPayment;
4use super::routing_transaction::RoutingTransaction;
5use crate::objects::entity::Entity;
6use crate::objects::transaction::Transaction;
7use serde::{Deserialize, Deserializer, Serialize};
8use serde_json::Value;
9
10pub trait LightningTransaction: Transaction + Entity {
11 fn type_name(&self) -> &'static str;
12}
13
14#[allow(clippy::large_enum_variant)]
15#[derive(Debug, Clone, Serialize)]
16pub enum LightningTransactionEnum {
17 IncomingPayment(IncomingPayment),
18 OutgoingPayment(OutgoingPayment),
19 RoutingTransaction(RoutingTransaction),
20}
21
22impl<'de> Deserialize<'de> for LightningTransactionEnum {
23 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
24 where
25 D: Deserializer<'de>,
26 {
27 let value = Value::deserialize(deserializer)?;
28 if let Some(typename) = value.get("__typename").and_then(Value::as_str) {
29 match typename {
30 "IncomingPayment" => {
31 let obj = IncomingPayment::deserialize(value).map_err(|err| {
32 serde::de::Error::custom(format!("Serde JSON Error {}", err))
33 })?;
34 Ok(LightningTransactionEnum::IncomingPayment(obj))
35 }
36 "OutgoingPayment" => {
37 let obj = OutgoingPayment::deserialize(value).map_err(|err| {
38 serde::de::Error::custom(format!("Serde JSON Error {}", err))
39 })?;
40 Ok(LightningTransactionEnum::OutgoingPayment(obj))
41 }
42 "RoutingTransaction" => {
43 let obj = RoutingTransaction::deserialize(value).map_err(|err| {
44 serde::de::Error::custom(format!("Serde JSON Error {}", err))
45 })?;
46 Ok(LightningTransactionEnum::RoutingTransaction(obj))
47 }
48
49 _ => Err(serde::de::Error::custom("unknown typename")),
50 }
51 } else {
52 Err(serde::de::Error::custom(
53 "missing __typename field on LightningTransaction",
54 ))
55 }
56 }
57}