xref: /aosp_15_r20/external/pigweed/pw_status/docs.rst (revision 61c4878ac05f98d0ceed94b57d316916de578985)
1*61c4878aSAndroid Build Coastguard Worker.. _module-pw_status:
2*61c4878aSAndroid Build Coastguard Worker
3*61c4878aSAndroid Build Coastguard Worker=========
4*61c4878aSAndroid Build Coastguard Workerpw_status
5*61c4878aSAndroid Build Coastguard Worker=========
6*61c4878aSAndroid Build Coastguard Worker.. pigweed-module::
7*61c4878aSAndroid Build Coastguard Worker   :name: pw_status
8*61c4878aSAndroid Build Coastguard Worker
9*61c4878aSAndroid Build Coastguard Worker   - **Easy**: Simple to understand, includes convenient macro ``PW_TRY``
10*61c4878aSAndroid Build Coastguard Worker   - **Efficient**: No memory allocation, no exceptions
11*61c4878aSAndroid Build Coastguard Worker   - **Established**: Just like ``absl::Status``, deployed extensively at Google
12*61c4878aSAndroid Build Coastguard Worker
13*61c4878aSAndroid Build Coastguard Worker   :cpp:type:`pw::Status` is Pigweed's error propagation primitive, enabling
14*61c4878aSAndroid Build Coastguard Worker   exception-free error handling. The primary feature of ``pw_status`` is the
15*61c4878aSAndroid Build Coastguard Worker   :cpp:class:`pw::Status` class, a simple, zero-overhead status object that
16*61c4878aSAndroid Build Coastguard Worker   wraps a status code, and the ``PW_TRY`` macro. For example:
17*61c4878aSAndroid Build Coastguard Worker
18*61c4878aSAndroid Build Coastguard Worker   .. code-block:: cpp
19*61c4878aSAndroid Build Coastguard Worker
20*61c4878aSAndroid Build Coastguard Worker      #include "pw_status/status.h"
21*61c4878aSAndroid Build Coastguard Worker
22*61c4878aSAndroid Build Coastguard Worker      pw::Status ImuEnable() {
23*61c4878aSAndroid Build Coastguard Worker        if (!device_has_imu) {
24*61c4878aSAndroid Build Coastguard Worker          return Status::FailedPrecondition();
25*61c4878aSAndroid Build Coastguard Worker        }
26*61c4878aSAndroid Build Coastguard Worker        PW_TRY(ImuSpiSendEnable());  // Propagates failure on non-OK status.
27*61c4878aSAndroid Build Coastguard Worker        return pw::OkStatus();
28*61c4878aSAndroid Build Coastguard Worker      }
29*61c4878aSAndroid Build Coastguard Worker
30*61c4878aSAndroid Build Coastguard Worker      void Initialize() {
31*61c4878aSAndroid Build Coastguard Worker        if (auto status = ImuEnable(); status.ok()) {
32*61c4878aSAndroid Build Coastguard Worker          PW_LOG_INFO("Imu initialized successfully")
33*61c4878aSAndroid Build Coastguard Worker        } else {
34*61c4878aSAndroid Build Coastguard Worker          if (status.IsFailedPrecondition()) {
35*61c4878aSAndroid Build Coastguard Worker            PW_LOG_WARNING("No IMU present");
36*61c4878aSAndroid Build Coastguard Worker          } else {
37*61c4878aSAndroid Build Coastguard Worker            PW_LOG_ERROR("Unknown error initializing IMU: %d", status.code());
38*61c4878aSAndroid Build Coastguard Worker          }
39*61c4878aSAndroid Build Coastguard Worker        }
40*61c4878aSAndroid Build Coastguard Worker      }
41*61c4878aSAndroid Build Coastguard Worker
42*61c4878aSAndroid Build Coastguard Worker``pw_status`` provides an implementation of status in every supported
43*61c4878aSAndroid Build Coastguard WorkerPigweed language, including C, Rust, TypeScript, Java, and Python.
44*61c4878aSAndroid Build Coastguard Worker
45*61c4878aSAndroid Build Coastguard WorkerPigweed's status matches Google's standard status codes (see the `Google APIs
46*61c4878aSAndroid Build Coastguard Workerrepository
47*61c4878aSAndroid Build Coastguard Worker<https://github.com/googleapis/googleapis/blob/HEAD/google/rpc/code.proto>`_).
48*61c4878aSAndroid Build Coastguard WorkerThese codes are used extensively in Google projects including `Abseil
49*61c4878aSAndroid Build Coastguard Worker<https://abseil.io>`_ (`status/status.h
50*61c4878aSAndroid Build Coastguard Worker<https://cs.opensource.google/abseil/abseil-cpp/+/HEAD:absl/status/status.h>`_)
51*61c4878aSAndroid Build Coastguard Workerand `gRPC <https://grpc.io>`_ (`doc/statuscodes.md
52*61c4878aSAndroid Build Coastguard Worker<https://github.com/grpc/grpc/blob/HEAD/doc/statuscodes.md>`_).
53*61c4878aSAndroid Build Coastguard Worker
54*61c4878aSAndroid Build Coastguard Worker.. grid:: 2
55*61c4878aSAndroid Build Coastguard Worker
56*61c4878aSAndroid Build Coastguard Worker   .. grid-item-card:: :octicon:`rocket` Get Started & Guides
57*61c4878aSAndroid Build Coastguard Worker      :link: module-pw_status-get-started
58*61c4878aSAndroid Build Coastguard Worker      :link-type: ref
59*61c4878aSAndroid Build Coastguard Worker      :class-item: sales-pitch-cta-primary
60*61c4878aSAndroid Build Coastguard Worker
61*61c4878aSAndroid Build Coastguard Worker      Integrate pw_status into your project, see common uses
62*61c4878aSAndroid Build Coastguard Worker
63*61c4878aSAndroid Build Coastguard Worker   .. grid-item-card:: :octicon:`code-square` API Reference
64*61c4878aSAndroid Build Coastguard Worker      :link: module-pw_status-reference
65*61c4878aSAndroid Build Coastguard Worker      :link-type: ref
66*61c4878aSAndroid Build Coastguard Worker      :class-item: sales-pitch-cta-secondary
67*61c4878aSAndroid Build Coastguard Worker
68*61c4878aSAndroid Build Coastguard Worker      Detailed description of pw_status's methods.
69*61c4878aSAndroid Build Coastguard Worker
70*61c4878aSAndroid Build Coastguard Worker.. _module-pw_status-quickref:
71*61c4878aSAndroid Build Coastguard Worker
72*61c4878aSAndroid Build Coastguard Worker---------------
73*61c4878aSAndroid Build Coastguard WorkerQuick reference
74*61c4878aSAndroid Build Coastguard Worker---------------
75*61c4878aSAndroid Build Coastguard WorkerSee :ref:`module-pw_status-codes` for the precise semantics of each error, as
76*61c4878aSAndroid Build Coastguard Workerwell as how to spell the status in each of our supported languages.  Click on
77*61c4878aSAndroid Build Coastguard Workerthe status names below to jump directly to that error's reference.
78*61c4878aSAndroid Build Coastguard Worker
79*61c4878aSAndroid Build Coastguard Worker.. list-table::
80*61c4878aSAndroid Build Coastguard Worker   :widths: 35 5 60
81*61c4878aSAndroid Build Coastguard Worker   :header-rows: 1
82*61c4878aSAndroid Build Coastguard Worker
83*61c4878aSAndroid Build Coastguard Worker   * - Status
84*61c4878aSAndroid Build Coastguard Worker     - Code
85*61c4878aSAndroid Build Coastguard Worker     - Description
86*61c4878aSAndroid Build Coastguard Worker   * - :c:enumerator:`OK`
87*61c4878aSAndroid Build Coastguard Worker     - 0
88*61c4878aSAndroid Build Coastguard Worker     - Operation succeeded
89*61c4878aSAndroid Build Coastguard Worker   * - :c:enumerator:`CANCELLED`
90*61c4878aSAndroid Build Coastguard Worker     - 1
91*61c4878aSAndroid Build Coastguard Worker     - Operation was cancelled, typically by the caller
92*61c4878aSAndroid Build Coastguard Worker   * - :c:enumerator:`UNKNOWN`
93*61c4878aSAndroid Build Coastguard Worker     - 2
94*61c4878aSAndroid Build Coastguard Worker     - Unknown error occurred. Avoid this code when possible.
95*61c4878aSAndroid Build Coastguard Worker   * - :c:enumerator:`INVALID_ARGUMENT`
96*61c4878aSAndroid Build Coastguard Worker     - 3
97*61c4878aSAndroid Build Coastguard Worker     - Argument was malformed; e.g. invalid characters when parsing integer
98*61c4878aSAndroid Build Coastguard Worker   * - :c:enumerator:`DEADLINE_EXCEEDED`
99*61c4878aSAndroid Build Coastguard Worker     - 4
100*61c4878aSAndroid Build Coastguard Worker     - Deadline passed before operation completed
101*61c4878aSAndroid Build Coastguard Worker   * - :c:enumerator:`NOT_FOUND`
102*61c4878aSAndroid Build Coastguard Worker     - 5
103*61c4878aSAndroid Build Coastguard Worker     - The entity that the caller requested (e.g. file or directory) is not
104*61c4878aSAndroid Build Coastguard Worker       found
105*61c4878aSAndroid Build Coastguard Worker   * - :c:enumerator:`ALREADY_EXISTS`
106*61c4878aSAndroid Build Coastguard Worker     - 6
107*61c4878aSAndroid Build Coastguard Worker     - The entity that the caller requested to create is already present
108*61c4878aSAndroid Build Coastguard Worker   * - :c:enumerator:`PERMISSION_DENIED`
109*61c4878aSAndroid Build Coastguard Worker     - 7
110*61c4878aSAndroid Build Coastguard Worker     - Caller lacks permission to execute action
111*61c4878aSAndroid Build Coastguard Worker   * - :c:enumerator:`RESOURCE_EXHAUSTED`
112*61c4878aSAndroid Build Coastguard Worker     - 8
113*61c4878aSAndroid Build Coastguard Worker     - Insufficient resources to complete operation; e.g. supplied buffer is too
114*61c4878aSAndroid Build Coastguard Worker       small
115*61c4878aSAndroid Build Coastguard Worker   * - :c:enumerator:`FAILED_PRECONDITION`
116*61c4878aSAndroid Build Coastguard Worker     - 9
117*61c4878aSAndroid Build Coastguard Worker     - System isn't in the required state; e.g. deleting a non-empty directory
118*61c4878aSAndroid Build Coastguard Worker   * - :c:enumerator:`ABORTED`
119*61c4878aSAndroid Build Coastguard Worker     - 10
120*61c4878aSAndroid Build Coastguard Worker     - Operation aborted due to e.g. concurrency issue or failed transaction
121*61c4878aSAndroid Build Coastguard Worker   * - :c:enumerator:`OUT_OF_RANGE`
122*61c4878aSAndroid Build Coastguard Worker     - 11
123*61c4878aSAndroid Build Coastguard Worker     - Operation attempted out of range; e.g. seeking past end of file
124*61c4878aSAndroid Build Coastguard Worker   * - :c:enumerator:`UNIMPLEMENTED`
125*61c4878aSAndroid Build Coastguard Worker     - 12
126*61c4878aSAndroid Build Coastguard Worker     - Operation isn't implemented or supported
127*61c4878aSAndroid Build Coastguard Worker   * - :c:enumerator:`INTERNAL`
128*61c4878aSAndroid Build Coastguard Worker     - 13
129*61c4878aSAndroid Build Coastguard Worker     - Internal error occurred; e.g. system invariants were violated
130*61c4878aSAndroid Build Coastguard Worker   * - :c:enumerator:`UNAVAILABLE`
131*61c4878aSAndroid Build Coastguard Worker     - 14
132*61c4878aSAndroid Build Coastguard Worker     - Requested operation can't finish now, but may at a later time
133*61c4878aSAndroid Build Coastguard Worker   * - :c:enumerator:`DATA_LOSS`
134*61c4878aSAndroid Build Coastguard Worker     - 15
135*61c4878aSAndroid Build Coastguard Worker     - Unrecoverable data loss occurred while completing the requested operation
136*61c4878aSAndroid Build Coastguard Worker   * - :c:enumerator:`UNAUTHENTICATED`
137*61c4878aSAndroid Build Coastguard Worker     - 16
138*61c4878aSAndroid Build Coastguard Worker     - Caller does not have valid authentication credentials for the operation
139*61c4878aSAndroid Build Coastguard Worker
140*61c4878aSAndroid Build Coastguard Worker.. toctree::
141*61c4878aSAndroid Build Coastguard Worker   :hidden:
142*61c4878aSAndroid Build Coastguard Worker   :maxdepth: 1
143*61c4878aSAndroid Build Coastguard Worker
144*61c4878aSAndroid Build Coastguard Worker   guide
145*61c4878aSAndroid Build Coastguard Worker   reference
146