blob: 0e65e3f1755746fb70e1c64e9231c026ef79b032 [file] [log] [blame]
// Copyright 2019 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_DEVELOPER_CMD_TASKS_TASK_H_
#define SRC_DEVELOPER_CMD_TASKS_TASK_H_
#include <lib/async/dispatcher.h>
#include <lib/fit/function.h>
#include <zircon/types.h>
#include <memory>
#include "src/developer/cmd/autocomplete.h"
#include "src/developer/cmd/command.h"
namespace cmd {
class Task {
public:
using Factory = std::unique_ptr<Task> (*)(async_dispatcher_t* dispatcher);
using CompletionCallback = fit::closure;
explicit Task(async_dispatcher_t* dispatcher);
virtual ~Task();
Task(const Task&) = delete;
Task& operator=(const Task&) = delete;
Task(Task&&) = delete;
Task& operator=(Task&&) = delete;
// Execute the given command.
//
// Can be called at most once for a given |Task| instance.
//
// Must return a non-ZX_OK value.
//
// If this function returns ZX_ERR_NEXT, then the task is complete and the
// caller can begin exectuing the next command. In this case, this function
// must not call |callback|.
//
// If this function returns ZX_ERR_ASYNC, then the task is not complete and
// will complete asynchronously at some point in the future. When the task
// completes, the task must call |callback|.
//
// If this function returns ZX_ERR_STOP, then the task is complete and the
// caller is not expected to execute further commands.
//
// Can also return any other negative zx_status_t value to signal synchronous
// error. In those cases, this function must not call |callback|.
virtual zx_status_t Execute(Command command, CompletionCallback callback) = 0;
virtual void Complete(Autocomplete* autocomplete);
// The dispatcher on which the task will schedule asynchronous work, if any.
async_dispatcher_t* dispatcher() const { return dispatcher_; }
private:
async_dispatcher_t* dispatcher_;
};
} // namespace cmd
#endif // SRC_DEVELOPER_CMD_TASKS_TASK_H_