lightspark/objects/
lightning_transaction.rs

1// Copyright ©, 2023-present, Lightspark Group, Inc. - All Rights Reserved
2use 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}