You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
66 lines
1.5 KiB
66 lines
1.5 KiB
//! Responses and requests for the state service(s).
|
|
//!
|
|
//! These are sent to `Supervisor` which then dispatches them accordingly.
|
|
use super::*;
|
|
|
|
|
|
/// The kind of request to send to the the service
|
|
#[derive(Debug)]
|
|
#[non_exhaustive]
|
|
pub enum ServiceRequestKind
|
|
{
|
|
/// A no-op request.
|
|
None,
|
|
|
|
/// Test request.
|
|
#[cfg(debug_assertions)] EchoRequest(String),
|
|
}
|
|
|
|
/// The kind of response to expect from a service query, if any.
|
|
#[derive(Debug)]
|
|
#[non_exhaustive]
|
|
pub enum ServiceResponseKind
|
|
{
|
|
/// Test response.
|
|
#[cfg(debug_assertions)] EchoResponse(String),
|
|
|
|
/// Empty response
|
|
None,
|
|
}
|
|
|
|
/// A response from a service to a specific query.
|
|
///
|
|
/// It is sent theough the `output` onehot channel in the `ServiceCommand` struct.
|
|
#[derive(Debug)]
|
|
pub struct ServiceResponse(ServiceRequestKind);
|
|
|
|
impl ServiceResponse
|
|
{
|
|
/// An empty (default) response
|
|
#[inline] pub const fn none() -> Self
|
|
{
|
|
Self(ServiceRequestKind::None)
|
|
}
|
|
}
|
|
|
|
/// A formed service request.
|
|
#[derive(Debug)]
|
|
pub struct ServiceRequest
|
|
{
|
|
kind: ServiceRequestKind,
|
|
output: oneshot::Sender<ServiceResponse>, // If there is no response, this sender will just be dropped and the future impl can return `None` instead of `Some(response)`.
|
|
}
|
|
|
|
impl ServiceRequest
|
|
{
|
|
/// Create a new request
|
|
pub(in super) fn new(kind: ServiceRequestKind) -> (Self, oneshot::Receiver<ServiceResponse>)
|
|
{
|
|
let (tx, rx) = oneshot::channel();
|
|
(Self {
|
|
kind,
|
|
output: tx
|
|
}, rx)
|
|
}
|
|
}
|