use super::GoalClientLifecycle;
use crate::{GoalClient, GoalUuid};
use rosidl_runtime_rs::Action;
use std::{
future::Future,
ops::{Deref, DerefMut},
pin::Pin,
task::{Context, Poll},
};
use tokio::sync::oneshot::Receiver;
pub struct RequestedGoalClient<A: Action> {
goal_id: GoalUuid,
receiver: Receiver<Option<GoalClient<A>>>,
#[allow(unused)]
lifecycle: GoalClientLifecycle<A>,
}
impl<A: Action> RequestedGoalClient<A> {
pub fn goal_id(&self) -> &GoalUuid {
&self.goal_id
}
pub(super) fn new(
goal_id: GoalUuid,
receiver: Receiver<Option<GoalClient<A>>>,
lifecycle: GoalClientLifecycle<A>,
) -> Self {
Self {
goal_id,
receiver,
lifecycle,
}
}
}
impl<A: Action> Deref for RequestedGoalClient<A> {
type Target = Receiver<Option<GoalClient<A>>>;
fn deref(&self) -> &Self::Target {
&self.receiver
}
}
impl<A: Action> DerefMut for RequestedGoalClient<A> {
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.receiver
}
}
impl<A: Action> Future for RequestedGoalClient<A> {
type Output = Option<GoalClient<A>>;
fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
Future::poll(Pin::new(&mut self.get_mut().receiver), cx)
.map(|result| result.unwrap())
}
}