protocol/service: introduce Responder type

Introduce a `Responder` type that wraps a
`crossbeam_channel::Sender<Result<T>>`.

It provides a standard constructor and three sending methods: one for
a `Result`, one for an `Ok` value, and one for an `Err` value.
This commit is contained in:
Fintan Halpenny 2026-02-13 08:49:58 +00:00 committed by Lorenz Leutgeb
parent 61a9b2140f
commit b1eedd3b64
1 changed files with 41 additions and 0 deletions

View File

@ -1,5 +1,7 @@
use std::{collections::HashSet, fmt, sync::Arc, time}; use std::{collections::HashSet, fmt, sync::Arc, time};
use crossbeam_channel::Receiver;
use crossbeam_channel::SendError;
use crossbeam_channel::Sender; use crossbeam_channel::Sender;
use radicle::crypto::PublicKey; use radicle::crypto::PublicKey;
use radicle::node::policy::Scope; use radicle::node::policy::Scope;
@ -20,6 +22,45 @@ pub type QueryState = dyn Fn(&dyn ServiceState) -> Result<()> + Send + Sync;
/// It is a type synonym for a [`std::result::Result`] /// It is a type synonym for a [`std::result::Result`]
pub type Result<T> = std::result::Result<T, Error>; pub type Result<T> = std::result::Result<T, Error>;
/// A [`Responder`] returns results after processing a service [`Command`].
///
/// To construct a [`Responder`], use [`Responder::new`], which also returns its
/// corresponding [`Receiver`].
///
/// To send results, use either:
/// - [`Responder::send`]
/// - [`Responder::ok`]
/// - [`Responder::err`]
pub struct Responder<T> {
channel: Sender<Result<T>>,
}
impl<T> Responder<T> {
/// Construct a new [`Responder`] and its corresponding [`Receiver`].
pub fn new() -> (Self, Receiver<Result<T>>) {
let (sender, receiver) = crossbeam_channel::bounded(1);
(Self { channel: sender }, receiver)
}
/// Send a [`Result`] to the receiver.
pub fn send(&self, result: Result<T>) -> std::result::Result<(), SendError<Result<T>>> {
self.channel.send(result)
}
/// Send a [`Result::Ok`] to the receiver.
pub fn ok(&self, value: T) -> std::result::Result<(), SendError<Result<T>>> {
self.send(Ok(value))
}
/// Send a [`Result::Err`] to the receiver.
pub fn err<E>(&self, error: E) -> std::result::Result<(), SendError<Result<T>>>
where
E: std::error::Error + Send + Sync + 'static,
{
self.send(Err(Error::other(error)))
}
}
/// Commands sent to the service by the operator. /// Commands sent to the service by the operator.
pub enum Command { pub enum Command {
/// Announce repository references for given repository and namespaces to peers. /// Announce repository references for given repository and namespaces to peers.