Skip to main content

opcua_core/messages/
response.rs

1use 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        /// Enum of all possible _response_ service messages.
11        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            /// Get the response header.
40            pub fn response_header(&self) -> &ResponseHeader {
41                match self {
42                    $( Self::$name(value) => &value.response_header, )*
43                }
44            }
45
46            /// Get the name of the request variant, for debugging and logging.
47            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}