use crate::blinded_path::message::AsyncPaymentsContext;
use crate::io;
use crate::ln::msgs::DecodeError;
use crate::onion_message::messenger::{MessageSendInstructions, Responder, ResponseInstruction};
use crate::onion_message::packet::OnionMessageContents;
use crate::prelude::*;
use crate::util::ser::{Readable, ReadableArgs, Writeable, Writer};
const HELD_HTLC_AVAILABLE_TLV_TYPE: u64 = 72;
const RELEASE_HELD_HTLC_TLV_TYPE: u64 = 74;
pub trait AsyncPaymentsMessageHandler {
fn handle_held_htlc_available(
&self, message: HeldHtlcAvailable, responder: Option<Responder>,
) -> Option<(ReleaseHeldHtlc, ResponseInstruction)>;
fn handle_release_held_htlc(&self, message: ReleaseHeldHtlc, context: AsyncPaymentsContext);
fn release_pending_messages(&self) -> Vec<(AsyncPaymentsMessage, MessageSendInstructions)> {
vec![]
}
}
#[derive(Clone, Debug)]
pub enum AsyncPaymentsMessage {
HeldHtlcAvailable(HeldHtlcAvailable),
ReleaseHeldHtlc(ReleaseHeldHtlc),
}
#[derive(Clone, Debug)]
pub struct HeldHtlcAvailable {}
#[derive(Clone, Debug)]
pub struct ReleaseHeldHtlc {}
impl OnionMessageContents for ReleaseHeldHtlc {
fn tlv_type(&self) -> u64 {
RELEASE_HELD_HTLC_TLV_TYPE
}
#[cfg(c_bindings)]
fn msg_type(&self) -> String {
"Release Held HTLC".to_string()
}
#[cfg(not(c_bindings))]
fn msg_type(&self) -> &'static str {
"Release Held HTLC"
}
}
impl_writeable_tlv_based!(HeldHtlcAvailable, {});
impl_writeable_tlv_based!(ReleaseHeldHtlc, {});
impl AsyncPaymentsMessage {
pub fn is_known_type(tlv_type: u64) -> bool {
match tlv_type {
HELD_HTLC_AVAILABLE_TLV_TYPE | RELEASE_HELD_HTLC_TLV_TYPE => true,
_ => false,
}
}
}
impl OnionMessageContents for AsyncPaymentsMessage {
fn tlv_type(&self) -> u64 {
match self {
Self::HeldHtlcAvailable(_) => HELD_HTLC_AVAILABLE_TLV_TYPE,
Self::ReleaseHeldHtlc(msg) => msg.tlv_type(),
}
}
#[cfg(c_bindings)]
fn msg_type(&self) -> String {
match &self {
Self::HeldHtlcAvailable(_) => "Held HTLC Available".to_string(),
Self::ReleaseHeldHtlc(msg) => msg.msg_type(),
}
}
#[cfg(not(c_bindings))]
fn msg_type(&self) -> &'static str {
match &self {
Self::HeldHtlcAvailable(_) => "Held HTLC Available",
Self::ReleaseHeldHtlc(msg) => msg.msg_type(),
}
}
}
impl Writeable for AsyncPaymentsMessage {
fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
match self {
Self::HeldHtlcAvailable(message) => message.write(w),
Self::ReleaseHeldHtlc(message) => message.write(w),
}
}
}
impl ReadableArgs<u64> for AsyncPaymentsMessage {
fn read<R: io::Read>(r: &mut R, tlv_type: u64) -> Result<Self, DecodeError> {
match tlv_type {
HELD_HTLC_AVAILABLE_TLV_TYPE => Ok(Self::HeldHtlcAvailable(Readable::read(r)?)),
RELEASE_HELD_HTLC_TLV_TYPE => Ok(Self::ReleaseHeldHtlc(Readable::read(r)?)),
_ => Err(DecodeError::InvalidValue),
}
}
}