14namespace opcua::services::detail {
16template <
typename WrapperType>
18 static_assert(opcua::detail::isWrapper<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>
36 if constexpr (opcua::detail::isWrapper<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 {
51 if constexpr (opcua::detail::isWrapper<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);
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);
Client * asWrapper(UA_Client *client) noexcept
Convert native UA_Client pointer to its wrapper instance.
constexpr bool isBad() const noexcept
Check if the status code is bad.
constexpr NativeType * asNative(WrapperType *wrapper) noexcept
Cast Wrapper object pointers to native object pointers.