| /* |
| * Copyright (C) 2015 The Android Open Source Project |
| * |
| * 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. |
| */ |
| |
| #ifndef ART_CMDLINE_CMDLINE_RESULT_H_ |
| #define ART_CMDLINE_CMDLINE_RESULT_H_ |
| |
| #include <assert.h> |
| #include <utils.h> |
| |
| namespace art { |
| // Result of an attempt to process the command line arguments. If fails, specifies |
| // the specific error code and an error message. |
| // Use the value-carrying CmdlineParseResult<T> to get an additional value out in a success case. |
| struct CmdlineResult { |
| enum Status { |
| kSuccess, |
| // Error codes: |
| kUsage, |
| kFailure, |
| kOutOfRange, |
| kUnknown, |
| }; |
| |
| // Short-hand for checking if the result was successful. |
| operator bool() const { |
| return IsSuccess(); |
| } |
| |
| // Check if the operation has succeeded. |
| bool IsSuccess() const { return status_ == kSuccess; } |
| // Check if the operation was not a success. |
| bool IsError() const { return status_ != kSuccess; } |
| // Get the specific status, regardless of whether it's failure or success. |
| Status GetStatus() const { return status_; } |
| |
| // Get the error message, *must* only be called for error status results. |
| const std::string& GetMessage() const { assert(IsError()); return message_; } |
| |
| // Constructor any status. No message. |
| explicit CmdlineResult(Status status) : status_(status) {} |
| |
| // Constructor with an error status, copying the message. |
| CmdlineResult(Status status, const std::string& message) |
| : status_(status), message_(message) { |
| assert(status != kSuccess); |
| } |
| |
| // Constructor with an error status, taking over the message. |
| CmdlineResult(Status status, std::string&& message) |
| : status_(status), message_(message) { |
| assert(status != kSuccess); |
| } |
| |
| // Make sure copying exists |
| CmdlineResult(const CmdlineResult&) = default; |
| // Make sure moving is cheap |
| CmdlineResult(CmdlineResult&&) = default; |
| |
| private: |
| const Status status_; |
| const std::string message_; |
| }; |
| |
| // TODO: code-generate this |
| static inline std::ostream& operator<<(std::ostream& stream, CmdlineResult::Status status) { |
| switch (status) { |
| case CmdlineResult::kSuccess: |
| stream << "kSuccess"; |
| break; |
| case CmdlineResult::kUsage: |
| stream << "kUsage"; |
| break; |
| case CmdlineResult::kFailure: |
| stream << "kFailure"; |
| break; |
| case CmdlineResult::kOutOfRange: |
| stream << "kOutOfRange"; |
| break; |
| case CmdlineResult::kUnknown: |
| stream << "kUnknown"; |
| break; |
| default: |
| UNREACHABLE(); |
| } |
| return stream; |
| } |
| } // namespace art |
| |
| #endif // ART_CMDLINE_CMDLINE_RESULT_H_ |