use std::marker::PhantomData;
use hiroz_cdr::{CdrBuffer, CdrDeserialize, CdrReader, CdrSerialize, CdrSerializedSize, CdrWriter};
use serde::{Deserialize, Serialize};
use super::{GoalId, GoalInfo, GoalStatus, ZAction};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CancelGoalRequest {
pub goal_info: GoalInfo,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CancelGoalResponse {
pub return_code: i8,
pub goals_canceling: Vec<GoalInfo>,
}
#[derive(Debug, Clone)]
pub struct GoalRequest<A: ZAction> {
pub goal_id: GoalId,
pub goal: A::Goal,
}
impl<A: ZAction> serde::Serialize for GoalRequest<A>
where
A: 'static,
A::Goal: serde::Serialize + 'static,
{
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
use serde::ser::SerializeStruct;
let mut state = serializer.serialize_struct("GoalRequest", 2)?;
state.serialize_field("goal_id", &self.goal_id)?;
state.serialize_field("goal", &self.goal)?;
state.end()
}
}
impl<'de, A: ZAction> serde::Deserialize<'de> for GoalRequest<A>
where
A: 'static,
A::Goal: serde::Deserialize<'de> + 'static,
{
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: serde::Deserializer<'de>,
{
#[derive(serde::Deserialize)]
struct GoalRequestHelper<B> {
goal_id: GoalId,
goal: B,
}
let helper = GoalRequestHelper::<A::Goal>::deserialize(deserializer)?;
Ok(GoalRequest {
goal_id: helper.goal_id,
goal: helper.goal,
})
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GoalResponse {
pub accepted: bool,
pub stamp_sec: i32,
pub stamp_nanosec: u32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ResultRequest {
pub goal_id: GoalId,
}
#[derive(Debug, Clone)]
pub struct ResultResponse<A: ZAction> {
pub status: GoalStatus,
pub result: A::Result,
}
impl<A: ZAction> serde::Serialize for ResultResponse<A>
where
A: 'static,
A::Result: serde::Serialize + 'static,
{
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
use serde::ser::SerializeStruct;
let mut state = serializer.serialize_struct("ResultResponse", 2)?;
state.serialize_field("status", &self.status)?;
state.serialize_field("result", &self.result)?;
state.end()
}
}
impl<'de, A: ZAction> serde::Deserialize<'de> for ResultResponse<A>
where
A: 'static,
A::Result: serde::Deserialize<'de> + 'static,
{
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: serde::Deserializer<'de>,
{
#[derive(serde::Deserialize)]
struct ResultResponseHelper<B> {
status: GoalStatus,
result: B,
}
let helper = ResultResponseHelper::<A::Result>::deserialize(deserializer)?;
Ok(ResultResponse {
status: helper.status,
result: helper.result,
})
}
}
#[derive(Debug, Clone)]
pub struct FeedbackMessage<A: ZAction> {
pub goal_id: GoalId,
pub feedback: A::Feedback,
}
impl<A: ZAction> serde::Serialize for FeedbackMessage<A>
where
A: 'static,
A::Feedback: serde::Serialize + 'static,
{
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
use serde::ser::SerializeStruct;
let mut state = serializer.serialize_struct("FeedbackMessage", 2)?;
state.serialize_field("goal_id", &self.goal_id)?;
state.serialize_field("feedback", &self.feedback)?;
state.end()
}
}
impl<'de, A: ZAction> serde::Deserialize<'de> for FeedbackMessage<A>
where
A: 'static,
A::Feedback: serde::Deserialize<'de> + 'static,
{
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: serde::Deserializer<'de>,
{
#[derive(serde::Deserialize)]
struct FeedbackMessageHelper<B> {
goal_id: GoalId,
feedback: B,
}
let helper = FeedbackMessageHelper::<A::Feedback>::deserialize(deserializer)?;
Ok(FeedbackMessage {
goal_id: helper.goal_id,
feedback: helper.feedback,
})
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct StatusMessage {
pub status_list: Vec<GoalStatusInfo>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GoalStatusInfo {
pub goal_info: GoalInfo,
pub status: GoalStatus,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SendGoalRequest<A: ZAction> {
pub goal_id: GoalId,
pub goal: A::Goal,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SendGoalResponse {
pub accepted: bool,
pub stamp_sec: i32,
pub stamp_nanosec: u32,
}
pub struct GoalService<A: ZAction>(PhantomData<A>);
impl<A: ZAction> crate::msg::ZService for GoalService<A> {
type Request = SendGoalRequest<A>;
type Response = SendGoalResponse;
}
impl<A: ZAction> crate::ServiceTypeInfo for GoalService<A> {
fn service_type_info() -> crate::entity::TypeInfo {
A::send_goal_type_info()
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GetResultRequest {
pub goal_id: GoalId,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GetResultResponse<A: ZAction> {
pub status: i8,
pub result: A::Result,
}
pub struct ResultService<A: ZAction>(PhantomData<A>);
impl<A: ZAction> crate::msg::ZService for ResultService<A> {
type Request = GetResultRequest;
type Response = GetResultResponse<A>;
}
impl<A: ZAction> crate::ServiceTypeInfo for ResultService<A> {
fn service_type_info() -> crate::entity::TypeInfo {
A::get_result_type_info()
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CancelGoalServiceRequest {
pub goal_info: GoalInfo,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CancelGoalServiceResponse {
pub return_code: i8,
pub goals_canceling: Vec<GoalInfo>,
}
pub struct CancelService<A: ZAction>(PhantomData<A>);
impl<A: ZAction> crate::msg::ZService for CancelService<A> {
type Request = CancelGoalServiceRequest;
type Response = CancelGoalServiceResponse;
}
impl<A: ZAction> crate::ServiceTypeInfo for CancelService<A> {
fn service_type_info() -> crate::entity::TypeInfo {
A::cancel_goal_type_info()
}
}
impl CdrSerialize for GoalStatusInfo {
fn cdr_serialize<BO: byteorder::ByteOrder, B: CdrBuffer>(&self, w: &mut CdrWriter<'_, BO, B>) {
self.goal_info.cdr_serialize(w);
self.status.cdr_serialize(w);
}
}
impl CdrDeserialize for GoalStatusInfo {
fn cdr_deserialize<'de, BO: byteorder::ByteOrder>(
r: &mut CdrReader<'de, BO>,
) -> hiroz_cdr::Result<Self> {
Ok(GoalStatusInfo {
goal_info: GoalInfo::cdr_deserialize(r)?,
status: GoalStatus::cdr_deserialize(r)?,
})
}
}
impl CdrSerializedSize for GoalStatusInfo {
fn cdr_serialized_size(&self, pos: usize) -> usize {
let p = self.goal_info.cdr_serialized_size(pos);
self.status.cdr_serialized_size(p)
}
}
impl CdrSerialize for CancelGoalRequest {
fn cdr_serialize<BO: byteorder::ByteOrder, B: CdrBuffer>(&self, w: &mut CdrWriter<'_, BO, B>) {
self.goal_info.cdr_serialize(w);
}
}
impl CdrDeserialize for CancelGoalRequest {
fn cdr_deserialize<'de, BO: byteorder::ByteOrder>(
r: &mut CdrReader<'de, BO>,
) -> hiroz_cdr::Result<Self> {
Ok(CancelGoalRequest {
goal_info: GoalInfo::cdr_deserialize(r)?,
})
}
}
impl CdrSerializedSize for CancelGoalRequest {
fn cdr_serialized_size(&self, pos: usize) -> usize {
self.goal_info.cdr_serialized_size(pos)
}
}
impl CdrSerialize for CancelGoalResponse {
fn cdr_serialize<BO: byteorder::ByteOrder, B: CdrBuffer>(&self, w: &mut CdrWriter<'_, BO, B>) {
self.return_code.cdr_serialize(w);
self.goals_canceling.cdr_serialize(w);
}
}
impl CdrDeserialize for CancelGoalResponse {
fn cdr_deserialize<'de, BO: byteorder::ByteOrder>(
r: &mut CdrReader<'de, BO>,
) -> hiroz_cdr::Result<Self> {
Ok(CancelGoalResponse {
return_code: i8::cdr_deserialize(r)?,
goals_canceling: Vec::<GoalInfo>::cdr_deserialize(r)?,
})
}
}
impl CdrSerializedSize for CancelGoalResponse {
fn cdr_serialized_size(&self, pos: usize) -> usize {
let p = self.return_code.cdr_serialized_size(pos);
self.goals_canceling.cdr_serialized_size(p)
}
}
impl CdrSerialize for GoalResponse {
fn cdr_serialize<BO: byteorder::ByteOrder, B: CdrBuffer>(&self, w: &mut CdrWriter<'_, BO, B>) {
self.accepted.cdr_serialize(w);
self.stamp_sec.cdr_serialize(w);
self.stamp_nanosec.cdr_serialize(w);
}
}
impl CdrDeserialize for GoalResponse {
fn cdr_deserialize<'de, BO: byteorder::ByteOrder>(
r: &mut CdrReader<'de, BO>,
) -> hiroz_cdr::Result<Self> {
Ok(GoalResponse {
accepted: bool::cdr_deserialize(r)?,
stamp_sec: i32::cdr_deserialize(r)?,
stamp_nanosec: u32::cdr_deserialize(r)?,
})
}
}
impl CdrSerializedSize for GoalResponse {
fn cdr_serialized_size(&self, pos: usize) -> usize {
let p = self.accepted.cdr_serialized_size(pos);
let p = self.stamp_sec.cdr_serialized_size(p);
self.stamp_nanosec.cdr_serialized_size(p)
}
}
impl CdrSerialize for ResultRequest {
fn cdr_serialize<BO: byteorder::ByteOrder, B: CdrBuffer>(&self, w: &mut CdrWriter<'_, BO, B>) {
self.goal_id.cdr_serialize(w);
}
}
impl CdrDeserialize for ResultRequest {
fn cdr_deserialize<'de, BO: byteorder::ByteOrder>(
r: &mut CdrReader<'de, BO>,
) -> hiroz_cdr::Result<Self> {
Ok(ResultRequest {
goal_id: GoalId::cdr_deserialize(r)?,
})
}
}
impl CdrSerializedSize for ResultRequest {
fn cdr_serialized_size(&self, pos: usize) -> usize {
self.goal_id.cdr_serialized_size(pos)
}
}
impl CdrSerialize for StatusMessage {
fn cdr_serialize<BO: byteorder::ByteOrder, B: CdrBuffer>(&self, w: &mut CdrWriter<'_, BO, B>) {
self.status_list.cdr_serialize(w);
}
}
impl CdrDeserialize for StatusMessage {
fn cdr_deserialize<'de, BO: byteorder::ByteOrder>(
r: &mut CdrReader<'de, BO>,
) -> hiroz_cdr::Result<Self> {
Ok(StatusMessage {
status_list: Vec::<GoalStatusInfo>::cdr_deserialize(r)?,
})
}
}
impl CdrSerializedSize for StatusMessage {
fn cdr_serialized_size(&self, pos: usize) -> usize {
self.status_list.cdr_serialized_size(pos)
}
}
impl CdrSerialize for SendGoalResponse {
fn cdr_serialize<BO: byteorder::ByteOrder, B: CdrBuffer>(&self, w: &mut CdrWriter<'_, BO, B>) {
self.accepted.cdr_serialize(w);
self.stamp_sec.cdr_serialize(w);
self.stamp_nanosec.cdr_serialize(w);
}
}
impl CdrDeserialize for SendGoalResponse {
fn cdr_deserialize<'de, BO: byteorder::ByteOrder>(
r: &mut CdrReader<'de, BO>,
) -> hiroz_cdr::Result<Self> {
Ok(SendGoalResponse {
accepted: bool::cdr_deserialize(r)?,
stamp_sec: i32::cdr_deserialize(r)?,
stamp_nanosec: u32::cdr_deserialize(r)?,
})
}
}
impl CdrSerializedSize for SendGoalResponse {
fn cdr_serialized_size(&self, pos: usize) -> usize {
let p = self.accepted.cdr_serialized_size(pos);
let p = self.stamp_sec.cdr_serialized_size(p);
self.stamp_nanosec.cdr_serialized_size(p)
}
}
impl CdrSerialize for GetResultRequest {
fn cdr_serialize<BO: byteorder::ByteOrder, B: CdrBuffer>(&self, w: &mut CdrWriter<'_, BO, B>) {
self.goal_id.cdr_serialize(w);
}
}
impl CdrDeserialize for GetResultRequest {
fn cdr_deserialize<'de, BO: byteorder::ByteOrder>(
r: &mut CdrReader<'de, BO>,
) -> hiroz_cdr::Result<Self> {
Ok(GetResultRequest {
goal_id: GoalId::cdr_deserialize(r)?,
})
}
}
impl CdrSerializedSize for GetResultRequest {
fn cdr_serialized_size(&self, pos: usize) -> usize {
self.goal_id.cdr_serialized_size(pos)
}
}
impl CdrSerialize for CancelGoalServiceRequest {
fn cdr_serialize<BO: byteorder::ByteOrder, B: CdrBuffer>(&self, w: &mut CdrWriter<'_, BO, B>) {
self.goal_info.cdr_serialize(w);
}
}
impl CdrDeserialize for CancelGoalServiceRequest {
fn cdr_deserialize<'de, BO: byteorder::ByteOrder>(
r: &mut CdrReader<'de, BO>,
) -> hiroz_cdr::Result<Self> {
Ok(CancelGoalServiceRequest {
goal_info: GoalInfo::cdr_deserialize(r)?,
})
}
}
impl CdrSerializedSize for CancelGoalServiceRequest {
fn cdr_serialized_size(&self, pos: usize) -> usize {
self.goal_info.cdr_serialized_size(pos)
}
}
impl CdrSerialize for CancelGoalServiceResponse {
fn cdr_serialize<BO: byteorder::ByteOrder, B: CdrBuffer>(&self, w: &mut CdrWriter<'_, BO, B>) {
self.return_code.cdr_serialize(w);
self.goals_canceling.cdr_serialize(w);
}
}
impl CdrDeserialize for CancelGoalServiceResponse {
fn cdr_deserialize<'de, BO: byteorder::ByteOrder>(
r: &mut CdrReader<'de, BO>,
) -> hiroz_cdr::Result<Self> {
Ok(CancelGoalServiceResponse {
return_code: i8::cdr_deserialize(r)?,
goals_canceling: Vec::<GoalInfo>::cdr_deserialize(r)?,
})
}
}
impl CdrSerializedSize for CancelGoalServiceResponse {
fn cdr_serialized_size(&self, pos: usize) -> usize {
let p = self.return_code.cdr_serialized_size(pos);
self.goals_canceling.cdr_serialized_size(p)
}
}
impl<A: ZAction + 'static> crate::msg::ZMessage for GoalRequest<A>
where
A::Goal: Send + Sync + serde::Serialize + for<'de> serde::Deserialize<'de> + 'static,
{
type Serdes = crate::msg::SerdeCdrSerdes<GoalRequest<A>>;
}
impl<A: ZAction + 'static> crate::msg::ZMessage for ResultResponse<A>
where
A::Result: Send + Sync + serde::Serialize + for<'de> serde::Deserialize<'de> + 'static,
{
type Serdes = crate::msg::SerdeCdrSerdes<ResultResponse<A>>;
}
impl<A: ZAction + 'static> crate::msg::ZMessage for FeedbackMessage<A>
where
A::Feedback: Send + Sync + serde::Serialize + for<'de> serde::Deserialize<'de> + 'static,
{
type Serdes = crate::msg::SerdeCdrSerdes<FeedbackMessage<A>>;
}
impl<A: ZAction + 'static> crate::msg::ZMessage for SendGoalRequest<A>
where
A::Goal: Send + Sync + serde::Serialize + for<'de> serde::Deserialize<'de> + 'static,
{
type Serdes = crate::msg::SerdeCdrSerdes<SendGoalRequest<A>>;
}
impl<A: ZAction + 'static> crate::msg::ZMessage for GetResultResponse<A>
where
A::Result: Send + Sync + serde::Serialize + for<'de> serde::Deserialize<'de> + 'static,
{
type Serdes = crate::msg::SerdeCdrSerdes<GetResultResponse<A>>;
}