1use std::marker::PhantomData;
2
3use rustdds::*;
4use serde::{Deserialize, Serialize};
5pub use action_msgs::{CancelGoalRequest, CancelGoalResponse, GoalId, GoalInfo, GoalStatusEnum};
6#[allow(unused_imports)]
7use log::{debug, error, info, warn};
8
9use crate::{action_msgs, builtin_interfaces, message::Message};
10
11mod client;
12#[doc(inline)]
13pub use client::ActionClient;
14
15mod server;
16#[doc(inline)]
17pub use server::{
18 AcceptedGoalHandle, ActionServer, AsyncActionServer, CancelHandle, ExecutingGoalHandle,
19 GoalEndStatus, GoalError, NewGoalHandle,
20};
21
22pub trait ActionTypes {
24 type GoalType: Message + Clone; type ResultType: Message + Clone; type FeedbackType: Message; fn goal_type_name(&self) -> &str;
29 fn result_type_name(&self) -> &str;
30 fn feedback_type_name(&self) -> &str;
31}
32
33pub struct Action<G, R, F> {
36 g: PhantomData<G>,
37 r: PhantomData<R>,
38 f: PhantomData<F>,
39 goal_typename: String,
40 result_typename: String,
41 feedback_typename: String,
42}
43
44impl<G, R, F> Action<G, R, F>
45where
46 G: Message + Clone,
47 R: Message + Clone,
48 F: Message,
49{
50 pub fn new(goal_typename: String, result_typename: String, feedback_typename: String) -> Self {
51 Self {
52 goal_typename,
53 result_typename,
54 feedback_typename,
55 g: PhantomData,
56 r: PhantomData,
57 f: PhantomData,
58 }
59 }
60}
61
62impl<G, R, F> ActionTypes for Action<G, R, F>
63where
64 G: Message + Clone,
65 R: Message + Clone,
66 F: Message,
67{
68 type GoalType = G;
69 type ResultType = R;
70 type FeedbackType = F;
71
72 fn goal_type_name(&self) -> &str {
73 &self.goal_typename
74 }
75
76 fn result_type_name(&self) -> &str {
77 &self.result_typename
78 }
79
80 fn feedback_type_name(&self) -> &str {
81 &self.feedback_typename
82 }
83}
84
85pub struct ActionClientQosPolicies {
89 pub goal_service: QosPolicies,
90 pub result_service: QosPolicies,
91 pub cancel_service: QosPolicies,
92 pub feedback_subscription: QosPolicies,
93 pub status_subscription: QosPolicies,
94}
95
96pub struct ActionServerQosPolicies {
98 pub goal_service: QosPolicies,
99 pub result_service: QosPolicies,
100 pub cancel_service: QosPolicies,
101 pub feedback_publisher: QosPolicies,
102 pub status_publisher: QosPolicies,
103}
104
105#[derive(Clone, Serialize, Deserialize, Debug)]
107pub struct SendGoalRequest<G> {
108 pub goal_id: GoalId,
109 pub goal: G,
110}
111impl<G: Message> Message for SendGoalRequest<G> {}
112
113#[derive(Clone, Serialize, Deserialize, Debug)]
115pub struct SendGoalResponse {
116 pub accepted: bool,
117 pub stamp: builtin_interfaces::Time,
118}
119impl Message for SendGoalResponse {}
120
121#[derive(Clone, Serialize, Deserialize, Debug)]
123pub struct GetResultRequest {
124 pub goal_id: GoalId,
125}
126impl Message for GetResultRequest {}
127
128#[derive(Clone, Serialize, Deserialize, Debug)]
130pub struct GetResultResponse<R> {
131 pub status: GoalStatusEnum, pub result: R,
133}
134impl<R: Message> Message for GetResultResponse<R> {}
135
136#[derive(Clone, Serialize, Deserialize, Debug)]
138pub struct FeedbackMessage<F> {
139 pub goal_id: GoalId,
140 pub feedback: F,
141}
142impl<F: Message> Message for FeedbackMessage<F> {}
143
144