opcua_core/messages/
response.rs1use crate::comms::message_chunk::MessageChunkType;
2
3use super::{Message, MessageType};
4use opcua_types::*;
5use std::io::{Read, Write};
6
7macro_rules! response_enum {
8 ($($name:ident: $value:ident; $enc:ident),*,) => {
9 #[derive(Debug, PartialEq, Clone)]
10 pub enum ResponseMessage {
12 $(
13 #[doc = stringify!($name)]
14 $name(Box<$value>),
15 )*
16 }
17 $(
18 impl From<$value> for ResponseMessage {
19 fn from(value: $value) -> Self {
20 Self::$name(Box::new(value))
21 }
22 }
23 )*
24 impl BinaryEncodable for ResponseMessage {
25 fn byte_len(&self, ctx: &opcua_types::Context<'_>) -> usize {
26 match self {
27 $( Self::$name(value) => value.byte_len(ctx), )*
28 }
29 }
30
31 fn encode<S: Write + ?Sized>(&self, stream: &mut S, ctx: &opcua_types::Context<'_>) -> EncodingResult<()> {
32 match self {
33 $( Self::$name(value) => value.encode(stream, ctx), )*
34 }
35 }
36 }
37
38 impl ResponseMessage {
39 pub fn response_header(&self) -> &ResponseHeader {
41 match self {
42 $( Self::$name(value) => &value.response_header, )*
43 }
44 }
45
46 pub fn type_name(&self) -> &'static str {
48 match self {
49 $( Self::$name(_) => stringify!($name), )*
50 }
51 }
52 }
53
54 impl Message for ResponseMessage {
55 fn request_handle(&self) -> u32 {
56 self.response_header().request_handle
57 }
58
59 fn decode_by_object_id<S: Read>(
60 stream: &mut S,
61 object_id: ObjectId,
62 ctx: &opcua_types::Context<'_>
63 ) -> EncodingResult<Self> {
64 match object_id {
65 $( ObjectId::$enc => {
66 Ok($value::decode(stream, ctx)?.into())
67 }, )*
68 _ => {
69 Err(Error::decoding(format!("decoding unsupported for object id {:?}", object_id)))
70 }
71 }
72 }
73
74 fn type_id(&self) -> NodeId {
75 match self {
76 $( Self::$name(v) => v.type_id().into(), )*
77 }
78 }
79 }
80 };
81}
82
83impl MessageType for ResponseMessage {
84 fn message_type(&self) -> MessageChunkType {
85 match self {
86 Self::OpenSecureChannel(_) => MessageChunkType::OpenSecureChannel,
87 Self::CloseSecureChannel(_) => MessageChunkType::CloseSecureChannel,
88 _ => MessageChunkType::Message,
89 }
90 }
91}
92
93response_enum! {
94 OpenSecureChannel: OpenSecureChannelResponse; OpenSecureChannelResponse_Encoding_DefaultBinary,
95 CloseSecureChannel: CloseSecureChannelResponse; CloseSecureChannelResponse_Encoding_DefaultBinary,
96 GetEndpoints: GetEndpointsResponse; GetEndpointsResponse_Encoding_DefaultBinary,
97 FindServers: FindServersResponse; FindServersResponse_Encoding_DefaultBinary,
98 FindServersOnNetwork: FindServersOnNetworkResponse; FindServersOnNetworkResponse_Encoding_DefaultBinary,
99 RegisterServer: RegisterServerResponse; RegisterServerResponse_Encoding_DefaultBinary,
100 RegisterServer2: RegisterServer2Response; RegisterServer2Response_Encoding_DefaultBinary,
101 CreateSession: CreateSessionResponse; CreateSessionResponse_Encoding_DefaultBinary,
102 CloseSession: CloseSessionResponse; CloseSessionResponse_Encoding_DefaultBinary,
103 Cancel: CancelResponse; CancelResponse_Encoding_DefaultBinary,
104 ActivateSession: ActivateSessionResponse; ActivateSessionResponse_Encoding_DefaultBinary,
105 AddNodes: AddNodesResponse; AddNodesResponse_Encoding_DefaultBinary,
106 AddReferences: AddReferencesResponse; AddReferencesResponse_Encoding_DefaultBinary,
107 DeleteNodes: DeleteNodesResponse; DeleteNodesResponse_Encoding_DefaultBinary,
108 DeleteReferences: DeleteReferencesResponse; DeleteReferencesResponse_Encoding_DefaultBinary,
109 CreateMonitoredItems: CreateMonitoredItemsResponse; CreateMonitoredItemsResponse_Encoding_DefaultBinary,
110 ModifyMonitoredItems: ModifyMonitoredItemsResponse; ModifyMonitoredItemsResponse_Encoding_DefaultBinary,
111 DeleteMonitoredItems: DeleteMonitoredItemsResponse; DeleteMonitoredItemsResponse_Encoding_DefaultBinary,
112 SetMonitoringMode: SetMonitoringModeResponse; SetMonitoringModeResponse_Encoding_DefaultBinary,
113 SetTriggering: SetTriggeringResponse; SetTriggeringResponse_Encoding_DefaultBinary,
114 CreateSubscription: CreateSubscriptionResponse; CreateSubscriptionResponse_Encoding_DefaultBinary,
115 ModifySubscription: ModifySubscriptionResponse; ModifySubscriptionResponse_Encoding_DefaultBinary,
116 DeleteSubscriptions: DeleteSubscriptionsResponse; DeleteSubscriptionsResponse_Encoding_DefaultBinary,
117 TransferSubscriptions: TransferSubscriptionsResponse; TransferSubscriptionsResponse_Encoding_DefaultBinary,
118 SetPublishingMode: SetPublishingModeResponse; SetPublishingModeResponse_Encoding_DefaultBinary,
119 QueryFirst: QueryFirstResponse; QueryFirstResponse_Encoding_DefaultBinary,
120 QueryNext: QueryNextResponse; QueryNextResponse_Encoding_DefaultBinary,
121 Browse: BrowseResponse; BrowseResponse_Encoding_DefaultBinary,
122 BrowseNext: BrowseNextResponse; BrowseNextResponse_Encoding_DefaultBinary,
123 Publish: PublishResponse; PublishResponse_Encoding_DefaultBinary,
124 Republish: RepublishResponse; RepublishResponse_Encoding_DefaultBinary,
125 TranslateBrowsePathsToNodeIds: TranslateBrowsePathsToNodeIdsResponse; TranslateBrowsePathsToNodeIdsResponse_Encoding_DefaultBinary,
126 RegisterNodes: RegisterNodesResponse; RegisterNodesResponse_Encoding_DefaultBinary,
127 UnregisterNodes: UnregisterNodesResponse; UnregisterNodesResponse_Encoding_DefaultBinary,
128 Read: ReadResponse; ReadResponse_Encoding_DefaultBinary,
129 HistoryRead: HistoryReadResponse; HistoryReadResponse_Encoding_DefaultBinary,
130 Write: WriteResponse; WriteResponse_Encoding_DefaultBinary,
131 HistoryUpdate: HistoryUpdateResponse; HistoryUpdateResponse_Encoding_DefaultBinary,
132 Call: CallResponse; CallResponse_Encoding_DefaultBinary,
133 ServiceFault: ServiceFault; ServiceFault_Encoding_DefaultBinary,
134}