/*
 * Shell backend used for testing
 *
 * Copyright (c) 2018 Nordic Semiconductor ASA
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#ifndef SHELL_DUMMY_H__
#define SHELL_DUMMY_H__

#include <shell/shell.h>

#ifdef __cplusplus
extern "C" {
#endif

extern const struct shell_transport_api shell_dummy_transport_api;

struct shell_dummy {
	bool initialized;

	/** current number of bytes in buffer (0 if no output) */
	size_t len;

	/** output buffer to collect shell output */
	char buf[CONFIG_SHELL_BACKEND_DUMMY_BUF_SIZE];
};

#define SHELL_DUMMY_DEFINE(_name)					\
	static struct shell_dummy _name##_shell_dummy;			\
	struct shell_transport _name = {				\
		.api = &shell_dummy_transport_api,			\
		.ctx = (struct shell_dummy *)&_name##_shell_dummy	\
	}

/**
 * @brief This function shall not be used directly. It provides pointer to shell
 *	  dummy backend instance.
 *
 * Function returns pointer to the shell dummy instance. This instance can be
 * next used with shell_execute_cmd function in order to test commands behavior.
 *
 * @returns Pointer to the shell instance.
 */
const struct shell *shell_backend_dummy_get_ptr(void);

/**
 * @brief Returns the buffered output in the shell and resets the pointer
 *
 * The returned data is always followed by a nul character at position *sizep
 *
 * @param shell	Shell pointer
 * @param sizep	Returns size of data in shell buffer
 * @returns pointer to buffer containing shell output
 */
const char *shell_backend_dummy_get_output(const struct shell *shell,
					   size_t *sizep);

/**
 * @brief Clears the output buffer in the shell backend.
 *
 * @param shell	Shell pointer
 */
void shell_backend_dummy_clear_output(const struct shell *shell);

#ifdef __cplusplus
}
#endif

#endif /* SHELL_DUMMY_H__ */
