use anyhow::Result;
use chrono::{TimeZone, Utc};
use serde::{Deserialize, Deserializer};
use super::LNBitsEndpoint;
#[derive(Debug, Deserialize)]
pub struct PaymentDetails {
pub status: String,
pub checking_id: String,
pub amount: i64,
pub fee: i64,
pub memo: String,
#[serde(deserialize_with = "deserialize_time")]
pub time: String,
#[serde(deserialize_with = "deserialize_time")]
pub created_at: String,
#[serde(deserialize_with = "deserialize_time")]
pub updated_at: String,
pub bolt11: String,
pub preimage: Option<String>,
pub payment_hash: String,
#[serde(deserialize_with = "deserialize_time")]
pub expiry: String,
pub extra: serde_json::Value,
pub wallet_id: String,
}
fn deserialize_time<'de, D>(deserializer: D) -> Result<String, D::Error>
where
D: Deserializer<'de>,
{
#[derive(Deserialize)]
#[serde(untagged)]
enum TimeValue {
Unix(u64),
String(String),
}
let time_value = TimeValue::deserialize(deserializer)?;
match time_value {
TimeValue::Unix(timestamp) => {
let datetime = Utc
.timestamp_opt(timestamp as i64, 0)
.single()
.ok_or_else(|| serde::de::Error::custom("Invalid timestamp"))?;
Ok(datetime.to_rfc3339())
}
TimeValue::String(s) => Ok(s),
}
}
#[derive(Debug, Deserialize)]
pub struct Payment {
pub paid: bool,
pub preimage: Option<String>,
pub details: PaymentDetails,
}
impl crate::LNBitsClient {
pub async fn get_payment_info(&self, payment_hash: &str) -> Result<Payment> {
let body = self
.make_get(
LNBitsEndpoint::PaymentHash(payment_hash.to_string()),
crate::api::LNBitsRequestKey::Admin,
)
.await?;
let payment: Payment = serde_json::from_str(&body)?;
Ok(payment)
}
}