xref: /aosp_15_r20/external/pigweed/pw_status/reference.rst (revision 61c4878ac05f98d0ceed94b57d316916de578985)
1*61c4878aSAndroid Build Coastguard Worker.. _module-pw_status-reference:
2*61c4878aSAndroid Build Coastguard Worker
3*61c4878aSAndroid Build Coastguard Worker=========
4*61c4878aSAndroid Build Coastguard WorkerReference
5*61c4878aSAndroid Build Coastguard Worker=========
6*61c4878aSAndroid Build Coastguard Worker.. pigweed-module-subpage::
7*61c4878aSAndroid Build Coastguard Worker   :name: pw_status
8*61c4878aSAndroid Build Coastguard Worker
9*61c4878aSAndroid Build Coastguard Worker.. _module-pw_status-codes:
10*61c4878aSAndroid Build Coastguard Worker
11*61c4878aSAndroid Build Coastguard Worker------------
12*61c4878aSAndroid Build Coastguard WorkerStatus codes
13*61c4878aSAndroid Build Coastguard Worker------------
14*61c4878aSAndroid Build Coastguard Worker.. c:enumerator:: OK = 0
15*61c4878aSAndroid Build Coastguard Worker
16*61c4878aSAndroid Build Coastguard Worker   :c:enumerator:`OK` indicates that the operation completede successfully.  It
17*61c4878aSAndroid Build Coastguard Worker   is typical to check for this value before proceeding on any given call across
18*61c4878aSAndroid Build Coastguard Worker   an API or RPC boundary. To check this value, use the ``ok()`` member function
19*61c4878aSAndroid Build Coastguard Worker   rather than inspecting the raw code.
20*61c4878aSAndroid Build Coastguard Worker
21*61c4878aSAndroid Build Coastguard Worker   .. list-table::
22*61c4878aSAndroid Build Coastguard Worker
23*61c4878aSAndroid Build Coastguard Worker      * - C++
24*61c4878aSAndroid Build Coastguard Worker        - ``pw::OkStatus()``
25*61c4878aSAndroid Build Coastguard Worker      * - C
26*61c4878aSAndroid Build Coastguard Worker        - ``PW_STATUS_OK``
27*61c4878aSAndroid Build Coastguard Worker      * - Python / Java / TypeScript
28*61c4878aSAndroid Build Coastguard Worker        - ``Status.OK``
29*61c4878aSAndroid Build Coastguard Worker      * - Rust
30*61c4878aSAndroid Build Coastguard Worker        - ``Ok(val)``
31*61c4878aSAndroid Build Coastguard Worker
32*61c4878aSAndroid Build Coastguard Worker.. c:enumerator:: CANCELLED = 1
33*61c4878aSAndroid Build Coastguard Worker
34*61c4878aSAndroid Build Coastguard Worker   :c:enumerator:`CANCELLED` indicates the operation was cancelled, typically by
35*61c4878aSAndroid Build Coastguard Worker   the caller.
36*61c4878aSAndroid Build Coastguard Worker
37*61c4878aSAndroid Build Coastguard Worker   .. list-table::
38*61c4878aSAndroid Build Coastguard Worker
39*61c4878aSAndroid Build Coastguard Worker      * - C++
40*61c4878aSAndroid Build Coastguard Worker        - ``pw::Status::Cancelled()``
41*61c4878aSAndroid Build Coastguard Worker      * - C
42*61c4878aSAndroid Build Coastguard Worker        - ``PW_STATUS_CANCELLED``
43*61c4878aSAndroid Build Coastguard Worker      * - Python / Java / TypeScript
44*61c4878aSAndroid Build Coastguard Worker        - ``Status.CANCELLED``
45*61c4878aSAndroid Build Coastguard Worker      * - Rust
46*61c4878aSAndroid Build Coastguard Worker        - ``Error::Cancelled``
47*61c4878aSAndroid Build Coastguard Worker
48*61c4878aSAndroid Build Coastguard Worker.. c:enumerator:: UNKNOWN = 2
49*61c4878aSAndroid Build Coastguard Worker
50*61c4878aSAndroid Build Coastguard Worker   :c:enumerator:`UNKNOWN` indicates an unknown error occurred. In general, more
51*61c4878aSAndroid Build Coastguard Worker   specific errors should be raised, if possible. Errors raised by APIs that do
52*61c4878aSAndroid Build Coastguard Worker   not return enough error information may be converted to this error.
53*61c4878aSAndroid Build Coastguard Worker
54*61c4878aSAndroid Build Coastguard Worker   .. list-table::
55*61c4878aSAndroid Build Coastguard Worker
56*61c4878aSAndroid Build Coastguard Worker      * - C++
57*61c4878aSAndroid Build Coastguard Worker        - ``pw::Status::Unknown()``
58*61c4878aSAndroid Build Coastguard Worker      * - C
59*61c4878aSAndroid Build Coastguard Worker        - ``PW_STATUS_UNKNOWN``
60*61c4878aSAndroid Build Coastguard Worker      * - Python / Java / TypeScript
61*61c4878aSAndroid Build Coastguard Worker        - ``Status.UNKNOWN``
62*61c4878aSAndroid Build Coastguard Worker      * - Rust
63*61c4878aSAndroid Build Coastguard Worker        - ``Error::Unknown``
64*61c4878aSAndroid Build Coastguard Worker
65*61c4878aSAndroid Build Coastguard Worker.. c:enumerator:: INVALID_ARGUMENT = 3
66*61c4878aSAndroid Build Coastguard Worker
67*61c4878aSAndroid Build Coastguard Worker   :c:enumerator:`INVALID_ARGUMENT` indicates the caller specified an invalid
68*61c4878aSAndroid Build Coastguard Worker   argument, such as a malformed filename. Note that use of such errors should
69*61c4878aSAndroid Build Coastguard Worker   be narrowly limited to indicate the invalid nature of the arguments
70*61c4878aSAndroid Build Coastguard Worker   themselves. Errors with validly formed arguments that may cause errors with
71*61c4878aSAndroid Build Coastguard Worker   the state of the receiving system should be denoted with
72*61c4878aSAndroid Build Coastguard Worker   :c:enumerator:`FAILED_PRECONDITION` instead.
73*61c4878aSAndroid Build Coastguard Worker
74*61c4878aSAndroid Build Coastguard Worker   .. list-table::
75*61c4878aSAndroid Build Coastguard Worker
76*61c4878aSAndroid Build Coastguard Worker      * - C++
77*61c4878aSAndroid Build Coastguard Worker        - ``pw::Status::InvalidArgument()``
78*61c4878aSAndroid Build Coastguard Worker      * - C
79*61c4878aSAndroid Build Coastguard Worker        - ``PW_STATUS_INVALID_ARGUMENT``
80*61c4878aSAndroid Build Coastguard Worker      * - Python / Java / TypeScript
81*61c4878aSAndroid Build Coastguard Worker        - ``Status.INVALID_ARGUMENT``
82*61c4878aSAndroid Build Coastguard Worker      * - Rust
83*61c4878aSAndroid Build Coastguard Worker        - ``Error::InvalidArgument``
84*61c4878aSAndroid Build Coastguard Worker
85*61c4878aSAndroid Build Coastguard Worker.. c:enumerator:: DEADLINE_EXCEEDED = 4
86*61c4878aSAndroid Build Coastguard Worker
87*61c4878aSAndroid Build Coastguard Worker   :c:enumerator:`DEADLINE_EXCEEDED` indicates a deadline expired before the
88*61c4878aSAndroid Build Coastguard Worker   operation could complete. For operations that may change state within a
89*61c4878aSAndroid Build Coastguard Worker   system, this error may be returned even if the operation has completed
90*61c4878aSAndroid Build Coastguard Worker   successfully. For example, a successful response from a server could have
91*61c4878aSAndroid Build Coastguard Worker   been delayed long enough for the deadline to expire.
92*61c4878aSAndroid Build Coastguard Worker
93*61c4878aSAndroid Build Coastguard Worker   .. list-table::
94*61c4878aSAndroid Build Coastguard Worker
95*61c4878aSAndroid Build Coastguard Worker      * - C++
96*61c4878aSAndroid Build Coastguard Worker        - ``pw::Status::DeadlineExceeded()``
97*61c4878aSAndroid Build Coastguard Worker      * - C
98*61c4878aSAndroid Build Coastguard Worker        - ``PW_STATUS_DEADLINE_EXCEEDED``
99*61c4878aSAndroid Build Coastguard Worker      * - Python / Java / TypeScript
100*61c4878aSAndroid Build Coastguard Worker        - ``Status.DEADLINE_EXCEEDED``
101*61c4878aSAndroid Build Coastguard Worker      * - Rust
102*61c4878aSAndroid Build Coastguard Worker        - ``Error::DeadlineExceeded``
103*61c4878aSAndroid Build Coastguard Worker
104*61c4878aSAndroid Build Coastguard Worker.. c:enumerator:: NOT_FOUND = 5
105*61c4878aSAndroid Build Coastguard Worker
106*61c4878aSAndroid Build Coastguard Worker   :c:enumerator:`NOT_FOUND` indicates some requested entity (such as a file or
107*61c4878aSAndroid Build Coastguard Worker   directory) was not found.
108*61c4878aSAndroid Build Coastguard Worker
109*61c4878aSAndroid Build Coastguard Worker   :c:enumerator:`NOT_FOUND` is useful if a request should be denied for an
110*61c4878aSAndroid Build Coastguard Worker   entire class of users, such as during a gradual feature rollout or
111*61c4878aSAndroid Build Coastguard Worker   undocumented allowlist. If a request should be denied for specific sets of
112*61c4878aSAndroid Build Coastguard Worker   users, such as through user-based access control, use
113*61c4878aSAndroid Build Coastguard Worker   :c:enumerator:`PERMISSION_DENIED` instead.
114*61c4878aSAndroid Build Coastguard Worker
115*61c4878aSAndroid Build Coastguard Worker   .. list-table::
116*61c4878aSAndroid Build Coastguard Worker
117*61c4878aSAndroid Build Coastguard Worker      * - C++
118*61c4878aSAndroid Build Coastguard Worker        - ``pw::Status::NotFound()``
119*61c4878aSAndroid Build Coastguard Worker      * - C
120*61c4878aSAndroid Build Coastguard Worker        - ``PW_STATUS_NOT_FOUND``
121*61c4878aSAndroid Build Coastguard Worker      * - Python / Java / TypeScript
122*61c4878aSAndroid Build Coastguard Worker        - ``Status.NOT_FOUND``
123*61c4878aSAndroid Build Coastguard Worker      * - Rust
124*61c4878aSAndroid Build Coastguard Worker        - ``Error::NotFound``
125*61c4878aSAndroid Build Coastguard Worker
126*61c4878aSAndroid Build Coastguard Worker.. c:enumerator:: ALREADY_EXISTS = 6
127*61c4878aSAndroid Build Coastguard Worker
128*61c4878aSAndroid Build Coastguard Worker   :c:enumerator:`ALREADY_EXISTS` indicates that the entity a caller attempted
129*61c4878aSAndroid Build Coastguard Worker   to create (such as a file or directory) is already present.
130*61c4878aSAndroid Build Coastguard Worker
131*61c4878aSAndroid Build Coastguard Worker   .. list-table::
132*61c4878aSAndroid Build Coastguard Worker
133*61c4878aSAndroid Build Coastguard Worker      * - C++
134*61c4878aSAndroid Build Coastguard Worker        - ``pw::Status::AlreadyExists()``
135*61c4878aSAndroid Build Coastguard Worker      * - C
136*61c4878aSAndroid Build Coastguard Worker        - ``PW_STATUS_ALREADY_EXISTS``
137*61c4878aSAndroid Build Coastguard Worker      * - Python / Java / TypeScript
138*61c4878aSAndroid Build Coastguard Worker        - ``Status.ALREADY_EXISTS``
139*61c4878aSAndroid Build Coastguard Worker      * - Rust
140*61c4878aSAndroid Build Coastguard Worker        - ``Error::AlreadyExists``
141*61c4878aSAndroid Build Coastguard Worker
142*61c4878aSAndroid Build Coastguard Worker.. c:enumerator:: PERMISSION_DENIED = 7
143*61c4878aSAndroid Build Coastguard Worker
144*61c4878aSAndroid Build Coastguard Worker   :c:enumerator:`PERMISSION_DENIED` indicates that the caller does not have
145*61c4878aSAndroid Build Coastguard Worker   permission to execute the specified operation. Note that this error is
146*61c4878aSAndroid Build Coastguard Worker   different than an error due to an unauthenticated user. This error code does
147*61c4878aSAndroid Build Coastguard Worker   not imply the request is valid or the requested entity exists or satisfies
148*61c4878aSAndroid Build Coastguard Worker   any other pre-conditions.
149*61c4878aSAndroid Build Coastguard Worker
150*61c4878aSAndroid Build Coastguard Worker   :c:enumerator:`PERMISSION_DENIED` must not be used for rejections caused by
151*61c4878aSAndroid Build Coastguard Worker   exhausting some resource. Instead, use :c:enumerator:`RESOURCE_EXHAUSTED` for
152*61c4878aSAndroid Build Coastguard Worker   those errors.  :c:enumerator:`PERMISSION_DENIED` must not be used if the
153*61c4878aSAndroid Build Coastguard Worker   caller cannot be identified.  Instead, use :c:enumerator:`UNAUTHENTICATED`
154*61c4878aSAndroid Build Coastguard Worker   for those errors.
155*61c4878aSAndroid Build Coastguard Worker
156*61c4878aSAndroid Build Coastguard Worker   .. list-table::
157*61c4878aSAndroid Build Coastguard Worker
158*61c4878aSAndroid Build Coastguard Worker      * - C++
159*61c4878aSAndroid Build Coastguard Worker        - ``pw::Status::PermissionDenied()``
160*61c4878aSAndroid Build Coastguard Worker      * - C
161*61c4878aSAndroid Build Coastguard Worker        - ``PW_STATUS_PERMISSION_DENIED``
162*61c4878aSAndroid Build Coastguard Worker      * - Python / Java / TypeScript
163*61c4878aSAndroid Build Coastguard Worker        - ``Status.PERMISSION_DENIED``
164*61c4878aSAndroid Build Coastguard Worker      * - Rust
165*61c4878aSAndroid Build Coastguard Worker        - ``Error::PermissionDenied``
166*61c4878aSAndroid Build Coastguard Worker
167*61c4878aSAndroid Build Coastguard Worker.. c:enumerator:: RESOURCE_EXHAUSTED = 8
168*61c4878aSAndroid Build Coastguard Worker
169*61c4878aSAndroid Build Coastguard Worker   :c:enumerator:`RESOURCE_EXHAUSTED` indicates some resource has been
170*61c4878aSAndroid Build Coastguard Worker   exhausted, perhaps a per-user quota, or perhaps the entire file system is out
171*61c4878aSAndroid Build Coastguard Worker   of space.
172*61c4878aSAndroid Build Coastguard Worker
173*61c4878aSAndroid Build Coastguard Worker   .. list-table::
174*61c4878aSAndroid Build Coastguard Worker
175*61c4878aSAndroid Build Coastguard Worker      * - C++
176*61c4878aSAndroid Build Coastguard Worker        - ``pw::Status::ResourceExhausted()``
177*61c4878aSAndroid Build Coastguard Worker      * - C
178*61c4878aSAndroid Build Coastguard Worker        - ``PW_STATUS_RESOURCE_EXHAUSTED``
179*61c4878aSAndroid Build Coastguard Worker      * - Python / Java / TypeScript
180*61c4878aSAndroid Build Coastguard Worker        - ``Status.RESOURCE_EXHAUSTED``
181*61c4878aSAndroid Build Coastguard Worker      * - Rust
182*61c4878aSAndroid Build Coastguard Worker        - ``Error::ResourceExhausted``
183*61c4878aSAndroid Build Coastguard Worker
184*61c4878aSAndroid Build Coastguard Worker.. c:enumerator:: FAILED_PRECONDITION = 9
185*61c4878aSAndroid Build Coastguard Worker
186*61c4878aSAndroid Build Coastguard Worker   :c:enumerator:`FAILED_PRECONDITION` indicates that the operation was rejected
187*61c4878aSAndroid Build Coastguard Worker   because the system is not in a state required for the operation's execution.
188*61c4878aSAndroid Build Coastguard Worker   For example, a directory to be deleted may be non-empty, an ``rmdir``
189*61c4878aSAndroid Build Coastguard Worker   operation is applied to a non-directory, etc.
190*61c4878aSAndroid Build Coastguard Worker
191*61c4878aSAndroid Build Coastguard Worker   .. _module-pw_status-guidelines:
192*61c4878aSAndroid Build Coastguard Worker
193*61c4878aSAndroid Build Coastguard Worker   Some guidelines that may help a service implementer in deciding between
194*61c4878aSAndroid Build Coastguard Worker   :c:enumerator:`FAILED_PRECONDITION`, :c:enumerator:`ABORTED`, and
195*61c4878aSAndroid Build Coastguard Worker   :c:enumerator:`UNAVAILABLE`:
196*61c4878aSAndroid Build Coastguard Worker
197*61c4878aSAndroid Build Coastguard Worker   a. Use :c:enumerator:`UNAVAILABLE` if the client can retry just the failing
198*61c4878aSAndroid Build Coastguard Worker      call.
199*61c4878aSAndroid Build Coastguard Worker   b. Use :c:enumerator:`ABORTED` if the client should retry at a higher
200*61c4878aSAndroid Build Coastguard Worker      transaction level (such as when a client-specified test-and-set fails,
201*61c4878aSAndroid Build Coastguard Worker      indicating the client should restart a read-modify-write sequence).
202*61c4878aSAndroid Build Coastguard Worker   c. Use :c:enumerator:`FAILED_PRECONDITION` if the client should not retry
203*61c4878aSAndroid Build Coastguard Worker      until the system state has been explicitly fixed. For example, if a
204*61c4878aSAndroid Build Coastguard Worker      ``rmdir`` fails because the directory is non-empty,
205*61c4878aSAndroid Build Coastguard Worker      :c:enumerator:`FAILED_PRECONDITION` should be returned since the client
206*61c4878aSAndroid Build Coastguard Worker      should not retry unless the files are deleted from the directory.
207*61c4878aSAndroid Build Coastguard Worker
208*61c4878aSAndroid Build Coastguard Worker   .. list-table::
209*61c4878aSAndroid Build Coastguard Worker
210*61c4878aSAndroid Build Coastguard Worker      * - C++
211*61c4878aSAndroid Build Coastguard Worker        - ``pw::Status::FailedPrecondition()``
212*61c4878aSAndroid Build Coastguard Worker      * - C
213*61c4878aSAndroid Build Coastguard Worker        - ``PW_STATUS_FAILED_PRECONDITION``
214*61c4878aSAndroid Build Coastguard Worker      * - Python / Java / TypeScript
215*61c4878aSAndroid Build Coastguard Worker        - ``Status.FAILED_PRECONDITION``
216*61c4878aSAndroid Build Coastguard Worker      * - Rust
217*61c4878aSAndroid Build Coastguard Worker        - ``Error::FailedPrecondition``
218*61c4878aSAndroid Build Coastguard Worker
219*61c4878aSAndroid Build Coastguard Worker.. c:enumerator:: ABORTED = 10
220*61c4878aSAndroid Build Coastguard Worker
221*61c4878aSAndroid Build Coastguard Worker   :c:enumerator:`ABORTED` indicates the operation was aborted, typically due to
222*61c4878aSAndroid Build Coastguard Worker   a concurrency issue such as a sequencer check failure or a failed
223*61c4878aSAndroid Build Coastguard Worker   transaction.
224*61c4878aSAndroid Build Coastguard Worker
225*61c4878aSAndroid Build Coastguard Worker   See the :ref:`guidelines <module-pw_status-guidelines>` above for deciding
226*61c4878aSAndroid Build Coastguard Worker   between :c:enumerator:`FAILED_PRECONDITION`, :c:enumerator:`ABORTED`, and
227*61c4878aSAndroid Build Coastguard Worker   :c:enumerator:`UNAVAILABLE`.
228*61c4878aSAndroid Build Coastguard Worker
229*61c4878aSAndroid Build Coastguard Worker   .. list-table::
230*61c4878aSAndroid Build Coastguard Worker
231*61c4878aSAndroid Build Coastguard Worker      * - C++
232*61c4878aSAndroid Build Coastguard Worker        - ``pw::Status::Aborted()``
233*61c4878aSAndroid Build Coastguard Worker      * - C
234*61c4878aSAndroid Build Coastguard Worker        - ``PW_STATUS_ABORTED``
235*61c4878aSAndroid Build Coastguard Worker      * - Python / Java / TypeScript
236*61c4878aSAndroid Build Coastguard Worker        - ``Status.ABORTED``
237*61c4878aSAndroid Build Coastguard Worker      * - Rust
238*61c4878aSAndroid Build Coastguard Worker        - ``Error::Aborted``
239*61c4878aSAndroid Build Coastguard Worker
240*61c4878aSAndroid Build Coastguard Worker.. c:enumerator:: OUT_OF_RANGE = 11
241*61c4878aSAndroid Build Coastguard Worker
242*61c4878aSAndroid Build Coastguard Worker   :c:enumerator:`OUT_OF_RANGE` indicates the operation was attempted past the
243*61c4878aSAndroid Build Coastguard Worker   valid range, such as seeking or reading past an end-of-file.
244*61c4878aSAndroid Build Coastguard Worker
245*61c4878aSAndroid Build Coastguard Worker   Unlike :c:enumerator:`INVALID_ARGUMENT`, this error indicates a problem that
246*61c4878aSAndroid Build Coastguard Worker   may be fixed if the system state changes. For example, a 32-bit file system
247*61c4878aSAndroid Build Coastguard Worker   will generate :c:enumerator:`INVALID_ARGUMENT` if asked to read at an offset
248*61c4878aSAndroid Build Coastguard Worker   that is not in the range [0,2^32-1], but it will generate
249*61c4878aSAndroid Build Coastguard Worker   :c:enumerator:`OUT_OF_RANGE` if asked to read from an offset past the current
250*61c4878aSAndroid Build Coastguard Worker   file size.
251*61c4878aSAndroid Build Coastguard Worker
252*61c4878aSAndroid Build Coastguard Worker   There is a fair bit of overlap between :c:enumerator:`FAILED_PRECONDITION`
253*61c4878aSAndroid Build Coastguard Worker   and :c:enumerator:`OUT_OF_RANGE`. Use :c:enumerator:`OUT_OF_RANGE` (the more
254*61c4878aSAndroid Build Coastguard Worker   specific error) when it applies so that callers who are iterating through a
255*61c4878aSAndroid Build Coastguard Worker   space can easily look for an :c:enumerator:`OUT_OF_RANGE` error to detect
256*61c4878aSAndroid Build Coastguard Worker   when they are done.
257*61c4878aSAndroid Build Coastguard Worker
258*61c4878aSAndroid Build Coastguard Worker   .. list-table::
259*61c4878aSAndroid Build Coastguard Worker
260*61c4878aSAndroid Build Coastguard Worker      * - C++
261*61c4878aSAndroid Build Coastguard Worker        - ``pw::Status::OutOfRange()``
262*61c4878aSAndroid Build Coastguard Worker      * - C
263*61c4878aSAndroid Build Coastguard Worker        - ``PW_STATUS_OUT_OF_RANGE``
264*61c4878aSAndroid Build Coastguard Worker      * - Python / Java / TypeScript
265*61c4878aSAndroid Build Coastguard Worker        - ``Status.OUT_OF_RANGE``
266*61c4878aSAndroid Build Coastguard Worker      * - Rust
267*61c4878aSAndroid Build Coastguard Worker        - ``Error::OutOfRange``
268*61c4878aSAndroid Build Coastguard Worker
269*61c4878aSAndroid Build Coastguard Worker.. c:enumerator:: UNIMPLEMENTED = 12
270*61c4878aSAndroid Build Coastguard Worker
271*61c4878aSAndroid Build Coastguard Worker   :c:enumerator:`UNIMPLEMENTED` indicates the operation is not implemented or
272*61c4878aSAndroid Build Coastguard Worker   supported in this service. In this case, the operation should not be
273*61c4878aSAndroid Build Coastguard Worker   re-attempted.
274*61c4878aSAndroid Build Coastguard Worker
275*61c4878aSAndroid Build Coastguard Worker   .. list-table::
276*61c4878aSAndroid Build Coastguard Worker
277*61c4878aSAndroid Build Coastguard Worker      * - C++
278*61c4878aSAndroid Build Coastguard Worker        - ``pw::Status::Unimplemented()``
279*61c4878aSAndroid Build Coastguard Worker      * - C
280*61c4878aSAndroid Build Coastguard Worker        - ``PW_STATUS_UNIMPLEMENTED``
281*61c4878aSAndroid Build Coastguard Worker      * - Python / Java / TypeScript
282*61c4878aSAndroid Build Coastguard Worker        - ``Status.UNIMPLEMENTED``
283*61c4878aSAndroid Build Coastguard Worker      * - Rust
284*61c4878aSAndroid Build Coastguard Worker        - ``Error::Unimplemented``
285*61c4878aSAndroid Build Coastguard Worker
286*61c4878aSAndroid Build Coastguard Worker.. c:enumerator:: INTERNAL = 13
287*61c4878aSAndroid Build Coastguard Worker
288*61c4878aSAndroid Build Coastguard Worker   :c:enumerator:`INTERNAL` indicates an internal error has occurred and some
289*61c4878aSAndroid Build Coastguard Worker   invariants expected by the underlying system have not been satisfied. This
290*61c4878aSAndroid Build Coastguard Worker   error code is reserved for serious errors.
291*61c4878aSAndroid Build Coastguard Worker
292*61c4878aSAndroid Build Coastguard Worker   .. list-table::
293*61c4878aSAndroid Build Coastguard Worker
294*61c4878aSAndroid Build Coastguard Worker      * - C++
295*61c4878aSAndroid Build Coastguard Worker        - ``pw::Status::Internal()``
296*61c4878aSAndroid Build Coastguard Worker      * - C
297*61c4878aSAndroid Build Coastguard Worker        - ``PW_STATUS_INTERNAL``
298*61c4878aSAndroid Build Coastguard Worker      * - Python / Java / TypeScript
299*61c4878aSAndroid Build Coastguard Worker        - ``Status.INTERNAL``
300*61c4878aSAndroid Build Coastguard Worker      * - Rust
301*61c4878aSAndroid Build Coastguard Worker        - ``Error::Internal``
302*61c4878aSAndroid Build Coastguard Worker
303*61c4878aSAndroid Build Coastguard Worker.. c:enumerator:: UNAVAILABLE = 14
304*61c4878aSAndroid Build Coastguard Worker
305*61c4878aSAndroid Build Coastguard Worker   :c:enumerator:`UNAVAILABLE` indicates the service is currently unavailable
306*61c4878aSAndroid Build Coastguard Worker   and that this is most likely a transient condition. An error such as this can
307*61c4878aSAndroid Build Coastguard Worker   be corrected by retrying with a backoff scheme. Note that it is not always
308*61c4878aSAndroid Build Coastguard Worker   safe to retry non-idempotent operations.
309*61c4878aSAndroid Build Coastguard Worker
310*61c4878aSAndroid Build Coastguard Worker   See the :ref:`guidelines <module-pw_status-guidelines>` above for deciding
311*61c4878aSAndroid Build Coastguard Worker   between :c:enumerator:`FAILED_PRECONDITION`, :c:enumerator:`ABORTED`, and
312*61c4878aSAndroid Build Coastguard Worker   :c:enumerator:`UNAVAILABLE`.
313*61c4878aSAndroid Build Coastguard Worker
314*61c4878aSAndroid Build Coastguard Worker   .. list-table::
315*61c4878aSAndroid Build Coastguard Worker
316*61c4878aSAndroid Build Coastguard Worker      * - C++
317*61c4878aSAndroid Build Coastguard Worker        - ``pw::Status::Unavailable()``
318*61c4878aSAndroid Build Coastguard Worker      * - C
319*61c4878aSAndroid Build Coastguard Worker        - ``PW_STATUS_UNAVAILABLE``
320*61c4878aSAndroid Build Coastguard Worker      * - Python / Java / TypeScript
321*61c4878aSAndroid Build Coastguard Worker        - ``Status.UNAVAILABLE``
322*61c4878aSAndroid Build Coastguard Worker      * - Rust
323*61c4878aSAndroid Build Coastguard Worker        - ``Error::Unavailable``
324*61c4878aSAndroid Build Coastguard Worker
325*61c4878aSAndroid Build Coastguard Worker.. c:enumerator:: DATA_LOSS = 15
326*61c4878aSAndroid Build Coastguard Worker
327*61c4878aSAndroid Build Coastguard Worker   :c:enumerator:`DATA_LOSS` indicates that unrecoverable data loss or
328*61c4878aSAndroid Build Coastguard Worker   corruption has occurred. As this error is serious, proper alerting should be
329*61c4878aSAndroid Build Coastguard Worker   attached to errors such as this.
330*61c4878aSAndroid Build Coastguard Worker
331*61c4878aSAndroid Build Coastguard Worker   .. list-table::
332*61c4878aSAndroid Build Coastguard Worker
333*61c4878aSAndroid Build Coastguard Worker      * - C++
334*61c4878aSAndroid Build Coastguard Worker        - ``pw::Status::DataLoss()``
335*61c4878aSAndroid Build Coastguard Worker      * - C
336*61c4878aSAndroid Build Coastguard Worker        - ``PW_STATUS_DATA_LOSS``
337*61c4878aSAndroid Build Coastguard Worker      * - Python / Java / TypeScript
338*61c4878aSAndroid Build Coastguard Worker        - ``Status.DATA_LOSS``
339*61c4878aSAndroid Build Coastguard Worker      * - Rust
340*61c4878aSAndroid Build Coastguard Worker        - ``Error::DataLoss``
341*61c4878aSAndroid Build Coastguard Worker
342*61c4878aSAndroid Build Coastguard Worker.. c:enumerator:: UNAUTHENTICATED = 16
343*61c4878aSAndroid Build Coastguard Worker
344*61c4878aSAndroid Build Coastguard Worker   :c:enumerator:`UNAUTHENTICATED` indicates that the request does not have
345*61c4878aSAndroid Build Coastguard Worker   valid authentication credentials for the operation. Correct the
346*61c4878aSAndroid Build Coastguard Worker   authentication and try again.
347*61c4878aSAndroid Build Coastguard Worker
348*61c4878aSAndroid Build Coastguard Worker   .. list-table::
349*61c4878aSAndroid Build Coastguard Worker
350*61c4878aSAndroid Build Coastguard Worker      * - C++
351*61c4878aSAndroid Build Coastguard Worker        - ``pw::Status::Unauthenticated()``
352*61c4878aSAndroid Build Coastguard Worker      * - C
353*61c4878aSAndroid Build Coastguard Worker        - ``PW_STATUS_UNAUTHENTICATED``
354*61c4878aSAndroid Build Coastguard Worker      * - Python / Java / TypeScript
355*61c4878aSAndroid Build Coastguard Worker        - ``Status.UNAUTHENTICATED``
356*61c4878aSAndroid Build Coastguard Worker      * - Rust
357*61c4878aSAndroid Build Coastguard Worker        - ``Error::Unauthenticated``
358*61c4878aSAndroid Build Coastguard Worker
359*61c4878aSAndroid Build Coastguard Worker-------
360*61c4878aSAndroid Build Coastguard WorkerC++ API
361*61c4878aSAndroid Build Coastguard Worker-------
362*61c4878aSAndroid Build Coastguard Worker.. doxygenclass:: pw::Status
363*61c4878aSAndroid Build Coastguard Worker   :members:
364*61c4878aSAndroid Build Coastguard Worker
365*61c4878aSAndroid Build Coastguard Worker.. doxygenfunction:: pw::OkStatus
366*61c4878aSAndroid Build Coastguard Worker
367*61c4878aSAndroid Build Coastguard Worker.. c:enum:: pw_Status
368*61c4878aSAndroid Build Coastguard Worker
369*61c4878aSAndroid Build Coastguard Worker   Enum to use in place of :cpp:class:`pw::Status` in C code. Always use
370*61c4878aSAndroid Build Coastguard Worker   :cpp:class:`pw::Status` in C++ code.
371*61c4878aSAndroid Build Coastguard Worker
372*61c4878aSAndroid Build Coastguard Worker   The values of the :c:enum:`pw_Status` enum are all-caps and prefixed with
373*61c4878aSAndroid Build Coastguard Worker   ``PW_STATUS_``. For example, ``PW_STATUS_DATA_LOSS`` corresponds with
374*61c4878aSAndroid Build Coastguard Worker   :c:enumerator:`DATA_LOSS`.
375*61c4878aSAndroid Build Coastguard Worker
376*61c4878aSAndroid Build Coastguard Worker.. doxygenclass:: pw::StatusWithSize
377*61c4878aSAndroid Build Coastguard Worker   :members:
378*61c4878aSAndroid Build Coastguard Worker   :undoc-members:
379*61c4878aSAndroid Build Coastguard Worker
380*61c4878aSAndroid Build Coastguard Worker.. doxygendefine:: PW_TRY
381*61c4878aSAndroid Build Coastguard Worker.. doxygendefine:: PW_TRY_ASSIGN
382*61c4878aSAndroid Build Coastguard Worker.. doxygendefine:: PW_TRY_WITH_SIZE
383*61c4878aSAndroid Build Coastguard Worker.. doxygendefine:: PW_CO_TRY
384*61c4878aSAndroid Build Coastguard Worker.. doxygendefine:: PW_CO_TRY_ASSIGN
385*61c4878aSAndroid Build Coastguard Worker
386*61c4878aSAndroid Build Coastguard Worker.. _module-pw_status-reference-unused:
387*61c4878aSAndroid Build Coastguard Worker
388*61c4878aSAndroid Build Coastguard WorkerUnused result warnings
389*61c4878aSAndroid Build Coastguard Worker----------------------
390*61c4878aSAndroid Build Coastguard WorkerIf the ``PW_STATUS_CFG_CHECK_IF_USED`` option is enabled, ``pw::Status`` objects
391*61c4878aSAndroid Build Coastguard Workerreturned from function calls must be used or it is a compilation error. To
392*61c4878aSAndroid Build Coastguard Workersilence these warnings call ``IgnoreError()`` on the returned status object.
393*61c4878aSAndroid Build Coastguard Worker
394*61c4878aSAndroid Build Coastguard Worker``PW_STATUS_CFG_CHECK_IF_USED`` defaults to ``false`` in GN and CMake, but
395*61c4878aSAndroid Build Coastguard Worker``true`` in Bazel. Pigweed compiles with this option enabled, but projects that
396*61c4878aSAndroid Build Coastguard Workeruse Pigweed will need to be updated to compile with this option. After all
397*61c4878aSAndroid Build Coastguard Workerprojects have migrated, unused result warnings will be enabled unconditionally.
398*61c4878aSAndroid Build Coastguard Worker
399*61c4878aSAndroid Build Coastguard Worker-----
400*61c4878aSAndroid Build Coastguard WorkerC API
401*61c4878aSAndroid Build Coastguard Worker-----
402*61c4878aSAndroid Build Coastguard Worker``pw_status`` provides the C-compatible :c:enum:`pw_Status` enum for the status
403*61c4878aSAndroid Build Coastguard Workercodes.  For ease of use, :cpp:class:`pw::Status` implicitly converts to and from
404*61c4878aSAndroid Build Coastguard Worker:c:enum:`pw_Status`.  However, the :c:enum:`pw_Status` enum should never be used
405*61c4878aSAndroid Build Coastguard Workerin C++; instead use the :cpp:class:`pw::Status` class.
406*61c4878aSAndroid Build Coastguard Worker
407*61c4878aSAndroid Build Coastguard Worker--------
408*61c4878aSAndroid Build Coastguard WorkerRust API
409*61c4878aSAndroid Build Coastguard Worker--------
410*61c4878aSAndroid Build Coastguard Worker``pw_status``'s Rust API is documented in our
411*61c4878aSAndroid Build Coastguard Worker`rustdoc API docs </rustdoc/pw_status/>`_.
412