sat-rs/satrs-example/src/requests.rs

95 lines
2.5 KiB
Rust
Raw Normal View History

use std::collections::HashMap;
use std::sync::mpsc;
use derive_new::new;
use satrs::action::ActionRequest;
use satrs::hk::HkRequest;
use satrs::mode::ModeRequest;
use satrs::pus::action::PusActionRequestRouter;
use satrs::pus::hk::PusHkRequestRouter;
use satrs::pus::verification::{TcStateAccepted, VerificationToken};
use satrs::pus::GenericRoutingError;
use satrs::queue::GenericSendError;
use satrs::TargetId;
2023-07-05 21:08:04 +02:00
#[allow(dead_code)]
#[derive(Clone, Eq, PartialEq, Debug)]
2023-02-15 11:19:23 +01:00
#[non_exhaustive]
2022-12-19 17:03:26 +01:00
pub enum Request {
2023-07-05 21:08:04 +02:00
Hk(HkRequest),
Mode(ModeRequest),
Action(ActionRequest),
2022-12-19 17:03:26 +01:00
}
2022-12-21 10:15:41 +01:00
#[derive(Clone, Eq, PartialEq, Debug, new)]
2023-02-27 13:44:24 +01:00
pub struct TargetedRequest {
pub(crate) target_id: TargetId,
2023-02-27 13:44:24 +01:00
pub(crate) request: Request,
}
2023-07-05 21:08:04 +02:00
#[derive(Clone, Eq, PartialEq, Debug)]
2023-02-27 13:44:24 +01:00
pub struct RequestWithToken {
pub(crate) targeted_request: TargetedRequest,
pub(crate) token: VerificationToken<TcStateAccepted>,
}
impl RequestWithToken {
pub fn new(
target_id: TargetId,
2023-02-27 13:44:24 +01:00
request: Request,
token: VerificationToken<TcStateAccepted>,
) -> Self {
Self {
targeted_request: TargetedRequest::new(target_id, request),
token,
}
}
}
#[derive(Default, Clone)]
pub struct GenericRequestRouter(pub HashMap<TargetId, mpsc::Sender<RequestWithToken>>);
impl PusHkRequestRouter for GenericRequestRouter {
type Error = GenericRoutingError;
fn route(
&self,
target_id: TargetId,
hk_request: HkRequest,
token: VerificationToken<TcStateAccepted>,
) -> Result<(), Self::Error> {
if let Some(sender) = self.0.get(&target_id) {
sender
.send(RequestWithToken::new(
target_id,
Request::Hk(hk_request),
token,
))
.map_err(|_| GenericRoutingError::SendError(GenericSendError::RxDisconnected))?;
}
Ok(())
}
}
impl PusActionRequestRouter for GenericRequestRouter {
type Error = GenericRoutingError;
fn route(
&self,
target_id: TargetId,
action_request: ActionRequest,
token: VerificationToken<TcStateAccepted>,
) -> Result<(), Self::Error> {
if let Some(sender) = self.0.get(&target_id) {
sender
.send(RequestWithToken::new(
target_id,
Request::Action(action_request),
token,
))
.map_err(|_| GenericRoutingError::SendError(GenericSendError::RxDisconnected))?;
}
Ok(())
}
}