use alloc::{
format,
string::{String, ToString},
vec,
};
use crate::wire::DeliverySeq;
use crate::lifecycle::{
ExitProductRangeRestore, MovableOrderClaim, MovableSequenceClaim, OrderClaimFrontierRestore,
OrderClaims, OrderDirectOwner, OrderHigh, OrderLedger, RecoverySequenceReserve,
SequenceClaimFrontierRestore, SequenceClaims, SequenceDirectOwner, SequenceLedger,
SequenceProductRangesRestore,
};
#[derive(Clone, Copy)]
pub(super) struct TwoExitClaims {
own_exit: DeliverySeq,
peer_exit: DeliverySeq,
own_exit_product: DeliverySeq,
peer_exit_product: DeliverySeq,
}
impl TwoExitClaims {
pub(super) fn above(high_watermark: DeliverySeq) -> Result<Self, String> {
let own_exit = high_watermark
.checked_add(1)
.ok_or_else(|| "fixture own exit claim overflow".to_string())?;
let peer_exit = own_exit
.checked_add(1)
.ok_or_else(|| "fixture peer exit claim overflow".to_string())?;
let own_exit_product = peer_exit
.checked_add(1)
.ok_or_else(|| "fixture own exit product overflow".to_string())?;
let peer_exit_product = own_exit_product
.checked_add(1)
.ok_or_else(|| "fixture peer exit product overflow".to_string())?;
Ok(Self {
own_exit,
peer_exit,
own_exit_product,
peer_exit_product,
})
}
}
pub(super) fn two_identity_ledgers(
high_watermark: DeliverySeq,
) -> Result<(SequenceLedger, OrderLedger), String> {
let sequence = SequenceLedger::try_new(
high_watermark,
SequenceClaims::new(2, 0, 0, RecoverySequenceReserve::None),
)
.map_err(|error| format!("fixture sequence ledger refused: {error:?}"))?;
let order = OrderLedger::try_new(
OrderHigh::Empty,
OrderClaims::new(0, 2, false, false)
.map_err(|error| format!("fixture order claims refused: {error:?}"))?,
)
.map_err(|error| format!("fixture order ledger refused: {error:?}"))?;
Ok((sequence, order))
}
pub(super) fn two_identity_sequence_restore(
claims: TwoExitClaims,
participant_id: u64,
peer_id: u64,
) -> SequenceClaimFrontierRestore {
SequenceClaimFrontierRestore {
movable_claims: vec![
MovableSequenceClaim {
delivery_seq: claims.own_exit,
owner: SequenceDirectOwner::MembershipExit {
participant_index: participant_id,
},
},
MovableSequenceClaim {
delivery_seq: claims.peer_exit,
owner: SequenceDirectOwner::MembershipExit {
participant_index: peer_id,
},
},
],
immutable_candidates: vec![],
products: SequenceProductRangesRestore {
live_times_terminal: vec![],
live_times_replacement_terminal: None,
other_live_times_exit: vec![
ExitProductRangeRestore {
start: claims.own_exit_product,
length: 1,
exit_participant: participant_id,
},
ExitProductRangeRestore {
start: claims.peer_exit_product,
length: 1,
exit_participant: peer_id,
},
],
},
recovery: None,
}
}
pub(super) fn two_identity_order_restore(
participant_id: u64,
peer_id: u64,
) -> OrderClaimFrontierRestore {
OrderClaimFrontierRestore {
movable_claims: vec![
MovableOrderClaim {
transaction_order: 0,
owner: OrderDirectOwner::MembershipExit {
participant_index: participant_id,
},
},
MovableOrderClaim {
transaction_order: 1,
owner: OrderDirectOwner::MembershipExit {
participant_index: peer_id,
},
},
],
immutable_candidates: vec![],
recovery: None,
}
}