14namespace opcua::services::detail {
16template <
typename WrapperType>
18 static_assert(opcua::detail::IsWrapper<WrapperType>::value);
19 using NativeType =
typename WrapperType::NativeType;
21 [[nodiscard]]
constexpr WrapperType operator()(
const NativeType& native)
noexcept {
25 [[nodiscard]]
constexpr WrapperType operator()(NativeType& native)
noexcept {
26 return {std::exchange(native, {})};
29 [[nodiscard]]
constexpr WrapperType operator()(NativeType&& native)
noexcept {
30 return {std::exchange(std::move(native), {})};
34template <
typename Response>
36 if constexpr (opcua::detail::IsWrapper<Response>::value) {
37 return asNative(response).responseHeader;
39 return response.responseHeader;
43template <
typename Response>
44StatusCode getServiceResult(
const Response& response)
noexcept {
48template <
typename Response>
49auto getSingleResultRef(Response& response)
noexcept {
51 if constexpr (opcua::detail::IsWrapper<Response>::value) {
52 return asNative(&response);
57 using ResultType = Result<
decltype(std::ref(*native->results))>;
58 if (
const StatusCode serviceResult = getServiceResult(response); serviceResult.
isBad()) {
59 return ResultType(BadResult(serviceResult));
61 if (native->results ==
nullptr || native->resultsSize != 1) {
62 return ResultType(BadResult(UA_STATUSCODE_BADUNEXPECTEDERROR));
64 return ResultType(std::ref(*native->results));
67template <
typename Response>
68StatusCode getSingleStatus(
const Response& response)
noexcept {
69 auto result = getSingleResultRef(response);
70 return result ? asWrapper<StatusCode>(result->get()) : result.code();
73template <
typename WrapperType,
typename Response>
74Result<WrapperType> wrapSingleResult(Response& response)
noexcept {
75 return getSingleResultRef(response).transform(Wrap<WrapperType>{});
79template <
typename WrapperType,
typename Response>
80WrapperType wrapSingleResultWithStatus(Response& response)
noexcept {
81 return *wrapSingleResult<WrapperType>(response).orElse([](
UA_StatusCode code) {
83 result->statusCode = code;
89 if (
const StatusCode code = result.statusCode; code.isBad()) {
90 return BadResult(code);
92 return Wrap<NodeId>{}(result.addedNodeId);
constexpr bool isBad() const noexcept
Check if the status code is bad.