blob: 1ae9b78b84ee5c6784687ae3d153b4e85bd42264 [file] [log] [blame]
// Copyright 2021 The Chromium OS 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 HPS_UTIL_COMMAND_H_
#define HPS_UTIL_COMMAND_H_
/*
* Class to automatically register commands.
*/
#include <iostream>
#include <memory>
#include <string>
#include <utility>
#include <string.h>
#include <base/command_line.h>
#include "hps/hps.h"
class Command {
public:
Command(const char* name,
const char* help,
int (*func)(std::unique_ptr<hps::HPS>,
const base::CommandLine::StringVector& args))
: name_(name), help_(help), func_(func), next_(nullptr) {
// Add myself to the list of commands.
this->next_ = list_;
list_ = this;
}
/*
* Match command and run.
* Returns exit value.
*/
static int Execute(const char* cmd,
std::unique_ptr<hps::HPS> hps,
const base::CommandLine::StringVector& args) {
for (auto el = list_; el != nullptr; el = el->next_) {
if (strcmp(el->name_, cmd) == 0) {
return el->func_(std::move(hps), args);
}
}
std::cerr << "no matching command: " << cmd << std::endl << GetHelp();
return 1;
}
static std::string GetHelp() {
std::ostringstream out;
out << "commands are:" << std::endl;
for (auto el = list_; el != nullptr; el = el->next_) {
out << " " << el->help_ << std::endl;
}
return out.str();
}
private:
const char* name_;
const char* help_;
int (*func_)(std::unique_ptr<hps::HPS>,
const base::CommandLine::StringVector&);
Command* next_;
static Command* list_; // Global head of command list.
};
#endif // HPS_UTIL_COMMAND_H_