use crate::routing::links::resources::build_outgoing::BuildOutgoingResourceError;
use crate::routing::links::resources::ResourceStrategy;
use crate::routing::links::LinkId;
use super::{PrnsCommand, Settleable, Settlement};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct SetResourceStrategy {
pub link_id: LinkId,
pub strategy: ResourceStrategy,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum SetResourceStrategyRejection {
NoSuchLink,
LinkNotActive,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum SetResourceStrategyFailure {
Rejected(SetResourceStrategyRejection),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum SendResourceRejection {
NoSuchLink,
LinkNotActive,
LinkBusy,
TableFull,
Build(BuildOutgoingResourceError),
MetadataMisplaced,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum SendResourceFailure {
Rejected(SendResourceRejection),
WriteFailed,
RejectedByPeer,
Sequencing,
Timeout,
PredecessorFailed,
}
impl Settleable for SetResourceStrategy {
type Success = ();
type Failure = SetResourceStrategyFailure;
fn into_command(self) -> PrnsCommand {
PrnsCommand::SetResourceStrategy(self)
}
fn from_settlement(settlement: Settlement) -> Option<Result<(), SetResourceStrategyFailure>> {
match settlement {
Settlement::SetResourceStrategy(result) => Some(result),
Settlement::AnnounceNow(_)
| Settlement::SendSinglePacket(_)
| Settlement::SendGroup(_)
| Settlement::RequestPath(_)
| Settlement::EstablishLink(_)
| Settlement::SendToLink(_)
| Settlement::Identify(_)
| Settlement::SendRequest(_)
| Settlement::Respond(_)
| Settlement::CloseLink(_)
| Settlement::SendResource(_)
| Settlement::SendToChannel(_)
| Settlement::AllowRequester(_) => None,
}
}
}