/*
* 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_