| // Copyright 2018 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #pragma once |
| |
| #include <stddef.h> |
| #include <stdint.h> |
| |
| #include <fbl/macros.h> |
| #include <fbl/string.h> |
| #include <fbl/unique_ptr.h> |
| #include <fbl/vector.h> |
| #include <zircon/types.h> |
| |
| namespace blkctl { |
| |
| class Command; |
| |
| class BlkCtl final { |
| public: |
| BlkCtl() |
| : force_(false), argn_(0) {} |
| ~BlkCtl() {} |
| |
| Command* cmd() { return cmd_ ? cmd_.get() : nullptr; } |
| |
| // Prints usage information based on the available |CommandSets|. |
| void Usage() const; |
| |
| // Converts the command line arguments into a |Command| object and runs it.. |
| static zx_status_t Execute(int argc, char** argv); |
| |
| // Converts the command line arguments into a |Command| object and runs it.. |
| zx_status_t Parse(int argc, char** argv); |
| |
| // Convenience functions to get the successive arguments. If the next argument is of the wrong |
| // type, or is missing and the optional flag is not set, it will return |ZX_ERR_INVALID_ARGS|. |
| // If the argument is missing, but |optional| is true, it will return |ZX_ERR_NOT_FOUND|. |
| zx_status_t GetNumArg(const char* argname, uint64_t* out, bool optional = false); |
| zx_status_t GetStrArg(const char* argname, const char** out, bool optional = false); |
| |
| // Rewinds the argument iterator by |n| arguments so they will be returned by |NextArg| again. |
| zx_status_t UngetArgs(size_t n); |
| |
| // Checks that all arguments were consumed. Returns |ZX_ERR_INVALID_ARGS| if arguments remain. |
| zx_status_t ArgsDone() const; |
| |
| // If "--force" has not been specified as an option, prompts the user to confirm the desired |
| // action. Returns ZX_ERR_CANCELED if the user does not confirm, ZX_OK otherwise. |
| zx_status_t Confirm() const; |
| |
| private: |
| DISALLOW_COPY_AND_ASSIGN_ALLOW_MOVE(BlkCtl); |
| |
| // The parsed command |
| fbl::unique_ptr<Command> cmd_; |
| // The executable name |
| fbl::String binname_; |
| // Arbitrary additional arguments to a command. |
| fbl::Vector<fbl::String> args_; |
| // A flag to skip confirmation prompts |
| bool force_; |
| // Index to the next argument |
| size_t argn_; |
| }; |
| |
| } // namespace blkctl |