use crate::protocol::common::parameter::Parameter;
use crate::remote_common::AnyClient;
use crate::remote_common::semaphore::SemaphoreGuard;
pub(crate) trait SendParameterResponse {
fn send_parameter_values(&self, parameters: Vec<Parameter>, request_id: Option<String>);
}
pub trait ParameterHandler: Send + Sync + 'static {
fn get(
&self,
client: AnyClient,
names: Vec<String>,
request_id: Option<String>,
responder: GetParametersResponder,
);
fn set(
&self,
client: AnyClient,
parameters: Vec<Parameter>,
request_id: Option<String>,
responder: SetParametersResponder,
);
}
#[must_use]
#[derive(Debug)]
pub struct GetParametersResponder {
client: AnyClient,
inner: Option<ResponderInner>,
}
impl GetParametersResponder {
pub(crate) fn new(
client: AnyClient,
request_id: Option<String>,
guard: SemaphoreGuard,
) -> Self {
Self {
client,
inner: Some(ResponderInner {
request_id,
_guard: guard,
}),
}
}
pub fn client(&self) -> AnyClient {
self.client.clone()
}
pub fn respond(mut self, parameters: Vec<Parameter>) {
if let Some(inner) = self.inner.take() {
self.client
.send_parameter_values(parameters, inner.request_id);
}
}
}
impl Drop for GetParametersResponder {
fn drop(&mut self) {
if self.inner.take().is_some() {
self.client
.send_error("Internal server error: parameter handler failed to send a response");
}
}
}
#[must_use]
#[derive(Debug)]
pub struct SetParametersResponder {
client: AnyClient,
inner: Option<ResponderInner>,
}
impl SetParametersResponder {
pub(crate) fn new(
client: AnyClient,
request_id: Option<String>,
guard: SemaphoreGuard,
) -> Self {
Self {
client,
inner: Some(ResponderInner {
request_id,
_guard: guard,
}),
}
}
pub fn client(&self) -> AnyClient {
self.client.clone()
}
pub fn respond(mut self, parameters: Vec<Parameter>) {
if let Some(inner) = self.inner.take() {
if inner.request_id.is_some() {
self.client
.send_parameter_values(parameters, inner.request_id);
}
}
}
}
impl Drop for SetParametersResponder {
fn drop(&mut self) {
if self.inner.take().is_some() {
self.client
.send_error("Internal server error: parameter handler failed to send a response");
}
}
}
#[derive(Debug)]
struct ResponderInner {
request_id: Option<String>,
_guard: SemaphoreGuard,
}