.. _module-pw_result: ========= pw_result ========= ``pw::Result`` is a class template for use in returning either a ``pw::Status`` error or an object of type ``T``. .. inclusive-language: disable ``pw::Result``'s implementation is closely based on Abseil's `StatusOr class `_. There are a few differences: .. inclusive-language: enable * ``pw::Result`` uses ``pw::Status``, which is much less sophisticated than ``absl::Status``. * ``pw::Result``'s functions are ``constexpr`` and ``pw::Result`` may be used in ``constexpr`` statements if ``T`` is trivially destructible. ----- Usage ----- Usage of ``pw::Result`` is identical to Abseil's ``absl::StatusOr``. See Abseil's `documentation `_ and `usage tips `_ for guidance. ``pw::Result`` is returned from a function that may return ``pw::OkStatus()`` and a value or an error status and no value. If ``ok()`` is true, the ``pw::Result`` contains a valid ``T``. Otherwise, it does not contain a ``T`` and attempting to access the value is an error. ``pw::Result`` can be used to directly access the contained type: .. code-block:: cpp #include "pw_result/result.h" if (pw::Result foo = TryCreateFoo(); foo.ok()) { foo->DoBar(); } ``pw::Result`` is compatible with ``PW_TRY`` and ``PW_TRY_ASSIGN``, for example: .. code-block:: cpp #include "pw_status/try.h" #include "pw_result/result.h" pw::Result GetAnswer(); // Example function. pw::Status UseAnswer() { const pw::Result answer = GetAnswer(); if (!answer.ok()) { return answer.status(); } if (answer.value() == 42) { WhatWasTheUltimateQuestion(); } return pw::OkStatus(); } pw::Status UseAnswerWithTry() { const pw::Result answer = GetAnswer(); PW_TRY(answer.status()); if (answer.value() == 42) { WhatWasTheUltimateQuestion(); } return pw::OkStatus(); } pw::Status UseAnswerWithTryAssign() { PW_TRY_ASSIGN(const int answer, GetAnswer()); if (answer == 42) { WhatWasTheUltimateQuestion(); } return pw::OkStatus(); } .. warning:: Be careful not to use larger types by value as this can quickly consume unnecessary stack. .. warning:: This module is experimental. Its impact on code size and stack usage has not yet been profiled. Use at your own risk. ----------- Size report ----------- The table below showcases the difference in size between functions returning a Status with an output pointer, and functions returning a Result, in various situations. Note that these are simplified examples which do not necessarily reflect the usage of Result in real code. Make sure to always run your own size reports to check if Result is suitable for you. .. include:: result_size ------ Zephyr ------ To enable ``pw_result`` for Zephyr add ``CONFIG_PIGWEED_RESULT=y`` to the project's configuration.