blob: c397c742abfe1d79c2fae8a196a577dc3ffa4df6 [file] [log] [blame]
// Copyright 2022 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.
#ifndef SRC_LIB_ZXDUMP_CLI_H_
#define SRC_LIB_ZXDUMP_CLI_H_
#include <lib/zxdump/task.h>
#include <cstdlib>
#include <functional>
#include <iostream>
#include <queue>
class CommandLineHelper {
public:
using TaskQueue = std::queue<std::reference_wrapper<zxdump::Task>>;
// These calls should be made while parsing switches.
void DumpFileArgument(const char* arg) { dump_files_.push(arg); }
void LiveArgument() { live_ = true; }
void NoMemory() { read_memory_ = false; }
void RootJobArgument() { use_root_job_ = true; }
// This is the final argument-parsing call, called with (argc, argv, optind)
// after parsing switches. It parses arguments that are PID or KOID numbers
// and it applies RootJobArgument if it was set earlier.
void KoidArguments(int argc, char** argv, int i, bool allow_jobs = true);
// After argument parsing, these can be called to ensure the TaskHolder has
// the necessary data access.
void NeedRootResource(bool need = true);
void NeedSystem(bool need = true);
// After argument parsing, these report what tasks were requested.
bool empty() const { return tasks_.empty(); }
zxdump::TaskHolder& holder() { return holder_; }
TaskQueue&& take_tasks() { return std::move(tasks_); }
// These are helpers for user error reporting. Ok(false) makes the eventual
// exit_status() be failure. Ok(result, "what") prints an error first if
// result.is_error().
void Ok(bool ok) { ok_ = ok && ok_; }
template <typename T, typename U>
bool Ok(T&& result, U&& failure) {
if (result.is_ok()) {
return true;
}
std::cerr << failure << ": " << result.error_value() << std::endl;
ok_ = false;
return false;
}
bool ok() const { return ok_; }
int exit_status() const { return ok_ ? EXIT_SUCCESS : EXIT_FAILURE; }
private:
zxdump::TaskHolder holder_;
std::queue<const char*> dump_files_;
TaskQueue tasks_;
bool live_ = false;
bool use_root_job_ = false;
bool read_memory_ = true;
bool ok_ = true;
};
#endif // SRC_LIB_ZXDUMP_CLI_H_