14namespace opcua::services::detail {
16template <
typename WrapperType>
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>
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 {
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) {
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.
constexpr T::NativeType * asNative(T *wrapper) noexcept
Cast Wrapper object pointers to native object pointers.
#define UA_STATUSCODE_BADUNEXPECTEDERROR
static constexpr bool value