1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187
|
// Copyright 2013 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
//
// This code was unceremoniously lifted from the version at
// github.com/google/lmctfy with a few minor modifications mainly to reduce the
// dependencies.
#ifndef CERT_TRANS_UTIL_STATUS_H_
#define CERT_TRANS_UTIL_STATUS_H_
#include <string>
namespace util {
namespace error {
// These values match the error codes in the codes.proto file of the original.
enum Code {
// Not an error; returned on success
OK = 0,
// The operation was cancelled (typically by the caller).
CANCELLED = 1,
// Unknown error.
UNKNOWN = 2,
// Client specified an invalid argument. Note that this differs
// from FAILED_PRECONDITION. INVALID_ARGUMENT indicates arguments
// that are problematic regardless of the state of the system
// (e.g., a malformed file name).
INVALID_ARGUMENT = 3,
// Deadline expired before operation could complete.
DEADLINE_EXCEEDED = 4,
// Some requested entity (e.g., file or directory) was not found.
NOT_FOUND = 5,
// Some entity that we attempted to create (e.g., file or directory)
// already exists.
ALREADY_EXISTS = 6,
// The caller does not have permission to execute the specified
// operation.
PERMISSION_DENIED = 7,
// Some resource has been exhausted, perhaps a per-user quota, or
// perhaps the entire file system is out of space.
RESOURCE_EXHAUSTED = 8,
// Operation was rejected because the system is not in a state
// required for the operation's execution. For example, directory
// to be deleted may be non-empty, an rmdir operation is applied to
// a non-directory, etc.
//
// A litmus test that may help a service implementor in deciding
// between FAILED_PRECONDITION, ABORTED, and UNAVAILABLE:
// (a) Use UNAVAILABLE if the client can retry just the failing call.
// (b) Use ABORTED if the client should retry at a higher-level
// (e.g., restarting a read-modify-write sequence).
// (c) Use FAILED_PRECONDITION if the client should not retry until
// the system state has been explicitly fixed. E.g., if an "rmdir"
// fails because the directory is non-empty, FAILED_PRECONDITION
// should be returned since the client should not retry unless
// they have first fixed up the directory by deleting files from it.
FAILED_PRECONDITION = 9,
// The operation was aborted, typically due to a concurrency issue
// like sequencer check failures, transaction aborts, etc.
//
// See litmus test above for deciding between FAILED_PRECONDITION,
// ABORTED, and UNAVAILABLE.
ABORTED = 10,
// Operation was attempted past the valid range. E.g., seeking or
// reading past end of file.
//
// Unlike INVALID_ARGUMENT, this error indicates a problem that may
// be fixed if the system state changes. For example, a 32-bit file
// system will generate INVALID_ARGUMENT if asked to read at an
// offset that is not in the range [0,2^32-1], but it will generate
// OUT_OF_RANGE if asked to read from an offset past the current
// file size.
OUT_OF_RANGE = 11,
// Operation is not implemented or not supported/enabled in this service.
UNIMPLEMENTED = 12,
// Internal errors. Means some invariants expected by underlying
// system has been broken. If you see one of these errors,
// something is very broken.
INTERNAL = 13,
// The service is currently unavailable. This is a most likely a
// transient condition and may be corrected by retrying with
// a backoff.
//
// See litmus test above for deciding between FAILED_PRECONDITION,
// ABORTED, and UNAVAILABLE.
UNAVAILABLE = 14,
// Unrecoverable data loss or corruption.
DATA_LOSS = 15,
};
} // namespace error
// A Status is a combination of an error code and a string message (for non-OK
// error codes).
class Status {
public:
// Creates an OK status
Status();
// Make a Status from the specified error and message.
Status(::util::error::Code error, const ::std::string& error_message);
Status(const Status& other);
Status& operator=(const Status& other);
// Some pre-defined Status objects
static const Status& OK; // Identical to 0-arg constructor
static const Status& CANCELLED;
static const Status& UNKNOWN;
// Accessors
bool ok() const {
return code_ == ::util::error::OK;
}
int error_code() const {
return code_;
}
::util::error::Code CanonicalCode() const {
return code_;
}
const ::std::string& error_message() const {
return message_;
}
bool operator==(const Status& x) const;
bool operator!=(const Status& x) const;
// NoOp
void IgnoreError() const {
}
::std::string ToString() const;
private:
::util::error::Code code_;
::std::string message_;
};
inline bool Status::operator==(const Status& other) const {
return (this->code_ == other.code_) && (this->message_ == other.message_);
}
inline bool Status::operator!=(const Status& other) const {
return !(*this == other);
}
extern ::std::string ErrorCodeString(util::error::Code error);
extern ::std::ostream& operator<<(::std::ostream& os,
::util::error::Code code);
extern ::std::ostream& operator<<(::std::ostream& os, const Status& other);
} // namespace util
#endif // CERT_TRANS_UTIL_STATUS_H_
|