prns-core 0.3.4

Pure Reticulum engine and wire contract for Personal Reticulum
use crate::engine::{
    CommandId, EngineReaction, Journaled, SendRequestFailure, SendSinglePacketFailure,
    SendToLinkFailure, Settlement,
};
use crate::routing::delivery::receipts::ReceiptKind;

pub(super) fn settle(
    sink: &mut impl FnMut(EngineReaction<'_>),
    id: CommandId,
    settlement: Settlement,
) {
    sink(EngineReaction::Journaled(Journaled::CommandSettled {
        id,
        settlement,
    }));
}

pub(super) fn culled_settlement(kind: ReceiptKind) -> Settlement {
    match kind {
        ReceiptKind::SendSinglePacket => {
            Settlement::SendSinglePacket(Err(SendSinglePacketFailure::Culled))
        }
        ReceiptKind::SendToLink(_) => Settlement::SendToLink(Err(SendToLinkFailure::Culled)),
        ReceiptKind::SendRequest { .. } => Settlement::SendRequest(Err(SendRequestFailure::Culled)),
    }
}

pub(super) fn timeout_settlement(kind: ReceiptKind) -> Settlement {
    match kind {
        ReceiptKind::SendSinglePacket => {
            Settlement::SendSinglePacket(Err(SendSinglePacketFailure::Timeout))
        }
        ReceiptKind::SendToLink(_) => Settlement::SendToLink(Err(SendToLinkFailure::Timeout)),
        ReceiptKind::SendRequest { .. } => {
            Settlement::SendRequest(Err(SendRequestFailure::Timeout))
        }
    }
}