xref: /aosp_15_r20/art/cmdline/cmdline_result.h (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1*795d594fSAndroid Build Coastguard Worker /*
2*795d594fSAndroid Build Coastguard Worker  * Copyright (C) 2015 The Android Open Source Project
3*795d594fSAndroid Build Coastguard Worker  *
4*795d594fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*795d594fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*795d594fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*795d594fSAndroid Build Coastguard Worker  *
8*795d594fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*795d594fSAndroid Build Coastguard Worker  *
10*795d594fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*795d594fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*795d594fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*795d594fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*795d594fSAndroid Build Coastguard Worker  * limitations under the License.
15*795d594fSAndroid Build Coastguard Worker  */
16*795d594fSAndroid Build Coastguard Worker 
17*795d594fSAndroid Build Coastguard Worker #ifndef ART_CMDLINE_CMDLINE_RESULT_H_
18*795d594fSAndroid Build Coastguard Worker #define ART_CMDLINE_CMDLINE_RESULT_H_
19*795d594fSAndroid Build Coastguard Worker 
20*795d594fSAndroid Build Coastguard Worker #include <assert.h>
21*795d594fSAndroid Build Coastguard Worker #include "base/utils.h"
22*795d594fSAndroid Build Coastguard Worker 
23*795d594fSAndroid Build Coastguard Worker namespace art {
24*795d594fSAndroid Build Coastguard Worker // Result of an attempt to process the command line arguments. If fails, specifies
25*795d594fSAndroid Build Coastguard Worker // the specific error code and an error message.
26*795d594fSAndroid Build Coastguard Worker // Use the value-carrying CmdlineParseResult<T> to get an additional value out in a success case.
27*795d594fSAndroid Build Coastguard Worker struct CmdlineResult {
28*795d594fSAndroid Build Coastguard Worker   enum Status {
29*795d594fSAndroid Build Coastguard Worker     kSuccess,
30*795d594fSAndroid Build Coastguard Worker     // Error codes:
31*795d594fSAndroid Build Coastguard Worker     kUsage,
32*795d594fSAndroid Build Coastguard Worker     kFailure,
33*795d594fSAndroid Build Coastguard Worker     kOutOfRange,
34*795d594fSAndroid Build Coastguard Worker     kUnknown,
35*795d594fSAndroid Build Coastguard Worker   };
36*795d594fSAndroid Build Coastguard Worker 
37*795d594fSAndroid Build Coastguard Worker   // Short-hand for checking if the result was successful.
38*795d594fSAndroid Build Coastguard Worker   operator bool() const {
39*795d594fSAndroid Build Coastguard Worker     return IsSuccess();
40*795d594fSAndroid Build Coastguard Worker   }
41*795d594fSAndroid Build Coastguard Worker 
42*795d594fSAndroid Build Coastguard Worker   // Check if the operation has succeeded.
IsSuccessCmdlineResult43*795d594fSAndroid Build Coastguard Worker   bool IsSuccess() const { return status_ == kSuccess; }
44*795d594fSAndroid Build Coastguard Worker   // Check if the operation was not a success.
IsErrorCmdlineResult45*795d594fSAndroid Build Coastguard Worker   bool IsError() const { return status_ != kSuccess; }
46*795d594fSAndroid Build Coastguard Worker   // Get the specific status, regardless of whether it's failure or success.
GetStatusCmdlineResult47*795d594fSAndroid Build Coastguard Worker   Status GetStatus() const { return status_; }
48*795d594fSAndroid Build Coastguard Worker 
49*795d594fSAndroid Build Coastguard Worker   // Get the error message, *must* only be called for error status results.
GetMessageCmdlineResult50*795d594fSAndroid Build Coastguard Worker   const std::string& GetMessage() const { assert(IsError()); return message_; }
51*795d594fSAndroid Build Coastguard Worker 
52*795d594fSAndroid Build Coastguard Worker   // Constructor any status. No message.
CmdlineResultCmdlineResult53*795d594fSAndroid Build Coastguard Worker   explicit CmdlineResult(Status status) : status_(status) {}
54*795d594fSAndroid Build Coastguard Worker 
55*795d594fSAndroid Build Coastguard Worker   // Constructor with an error status, copying the message.
CmdlineResultCmdlineResult56*795d594fSAndroid Build Coastguard Worker   CmdlineResult(Status status, const std::string& message)
57*795d594fSAndroid Build Coastguard Worker     : status_(status), message_(message) {
58*795d594fSAndroid Build Coastguard Worker     assert(status != kSuccess);
59*795d594fSAndroid Build Coastguard Worker   }
60*795d594fSAndroid Build Coastguard Worker 
61*795d594fSAndroid Build Coastguard Worker   // Constructor with an error status, taking over the message.
CmdlineResultCmdlineResult62*795d594fSAndroid Build Coastguard Worker   CmdlineResult(Status status, std::string&& message)
63*795d594fSAndroid Build Coastguard Worker     : status_(status), message_(message) {
64*795d594fSAndroid Build Coastguard Worker     assert(status != kSuccess);
65*795d594fSAndroid Build Coastguard Worker   }
66*795d594fSAndroid Build Coastguard Worker 
67*795d594fSAndroid Build Coastguard Worker   // Make sure copying exists
68*795d594fSAndroid Build Coastguard Worker   CmdlineResult(const CmdlineResult&) = default;
69*795d594fSAndroid Build Coastguard Worker   // Make sure moving is cheap
70*795d594fSAndroid Build Coastguard Worker   CmdlineResult(CmdlineResult&&) = default;
71*795d594fSAndroid Build Coastguard Worker 
72*795d594fSAndroid Build Coastguard Worker  private:
73*795d594fSAndroid Build Coastguard Worker   const Status status_;
74*795d594fSAndroid Build Coastguard Worker   const std::string message_;
75*795d594fSAndroid Build Coastguard Worker };
76*795d594fSAndroid Build Coastguard Worker 
77*795d594fSAndroid Build Coastguard Worker // TODO: code-generate this
78*795d594fSAndroid Build Coastguard Worker static inline std::ostream& operator<<(std::ostream& stream, CmdlineResult::Status status) {
79*795d594fSAndroid Build Coastguard Worker   switch (status) {
80*795d594fSAndroid Build Coastguard Worker     case CmdlineResult::kSuccess:
81*795d594fSAndroid Build Coastguard Worker       stream << "kSuccess";
82*795d594fSAndroid Build Coastguard Worker       break;
83*795d594fSAndroid Build Coastguard Worker     case CmdlineResult::kUsage:
84*795d594fSAndroid Build Coastguard Worker       stream << "kUsage";
85*795d594fSAndroid Build Coastguard Worker       break;
86*795d594fSAndroid Build Coastguard Worker     case CmdlineResult::kFailure:
87*795d594fSAndroid Build Coastguard Worker       stream << "kFailure";
88*795d594fSAndroid Build Coastguard Worker       break;
89*795d594fSAndroid Build Coastguard Worker     case CmdlineResult::kOutOfRange:
90*795d594fSAndroid Build Coastguard Worker       stream << "kOutOfRange";
91*795d594fSAndroid Build Coastguard Worker       break;
92*795d594fSAndroid Build Coastguard Worker     case CmdlineResult::kUnknown:
93*795d594fSAndroid Build Coastguard Worker       stream << "kUnknown";
94*795d594fSAndroid Build Coastguard Worker       break;
95*795d594fSAndroid Build Coastguard Worker   }
96*795d594fSAndroid Build Coastguard Worker   return stream;
97*795d594fSAndroid Build Coastguard Worker }
98*795d594fSAndroid Build Coastguard Worker }  // namespace art
99*795d594fSAndroid Build Coastguard Worker 
100*795d594fSAndroid Build Coastguard Worker #endif  // ART_CMDLINE_CMDLINE_RESULT_H_
101