/*
 * param.h
 */
/**
\ingroup clish
\defgroup clish_param param
@{

\brief This class represents an instance of a parameter type.

Parameter instances are assocated with a command line and used to validate the
the arguments which a user is inputing for a command.

*/
#ifndef _clish_param_h
#define _clish_param_h

typedef struct clish_paramv_s clish_paramv_t;
typedef struct clish_param_s clish_param_t;

#include "clish/types.h"
#include "clish/ptype.h"
#include "clish/pargv.h"
#include "clish/var.h"

/**
 * The means by which the param is interpreted.
 */
typedef enum {
    /**
     * A common parameter.
    */
	CLISH_PARAM_COMMON,
    /**
     * A swich parameter.
     * Choose the only one of nested parameters.
     */
	CLISH_PARAM_SWITCH,
    /**
     * A subcomand.
     * Identified by it's name.
     */
	CLISH_PARAM_SUBCOMMAND
} clish_param_mode_e;

/*=====================================
 * PARAM INTERFACE
 *===================================== */
/*-----------------
 * meta functions
 *----------------- */
clish_param_t *clish_param_new(const char *name,
	const char *text, clish_ptype_t *ptype);
/*-----------------
 * methods
 *----------------- */
void clish_param_delete(clish_param_t * instance);
void clish_param_help(const clish_param_t * instance, clish_help_t *help);
void clish_param_help_arrow(const clish_param_t * instance, size_t offset);
char *clish_param_validate(const clish_param_t * instance, const char *text);
void clish_param_dump(const clish_param_t * instance);
void clish_param_insert_param(clish_param_t * instance, clish_param_t * param);
/*-----------------
 * attributes
 *----------------- */
const char *clish_param__get_name(const clish_param_t * instance);
const char *clish_param__get_text(const clish_param_t * instance);
const char *clish_param__get_range(const clish_param_t * instance);
const char *clish_param__get_default(const clish_param_t * instance);
clish_ptype_t *clish_param__get_ptype(const clish_param_t * instance);
void clish_param__set_default(clish_param_t * instance, const char *defval);
void clish_param__set_mode(clish_param_t * instance, clish_param_mode_e mode);
clish_param_mode_e clish_param__get_mode(const clish_param_t * instance);

clish_param_t *clish_param__get_param(const clish_param_t * instance,
				unsigned index);
unsigned int clish_param__get_param_count(const clish_param_t * instance);
clish_paramv_t *clish_param__get_paramv(clish_param_t * instance);
void clish_param__set_optional(clish_param_t * instance, bool_t optional);
bool_t clish_param__get_optional(const clish_param_t * instance);
void clish_param__set_order(clish_param_t * instance, bool_t order);
bool_t clish_param__get_order(const clish_param_t * instance);
void clish_param__set_value(clish_param_t * instance, const char * value);
char *clish_param__get_value(const clish_param_t * instance);
void clish_param__set_hidden(clish_param_t * instance, bool_t hidden);
bool_t clish_param__get_hidden(const clish_param_t * instance);
void clish_param__set_test(clish_param_t * instance, const char *test);
char *clish_param__get_test(const clish_param_t *instance);
void clish_param__set_completion(clish_param_t *instance, const char *completion);
char *clish_param__get_completion(const clish_param_t *instance);

/* paramv methods */
clish_paramv_t *clish_paramv_new(void);
void clish_paramv_delete(clish_paramv_t * instance);
void clish_paramv_insert(clish_paramv_t * instance, clish_param_t * param);
clish_param_t *clish_paramv__get_param(const clish_paramv_t * instance,
				unsigned index);
unsigned int clish_paramv__get_count(const clish_paramv_t * instance);
clish_param_t *clish_paramv_find_param(const clish_paramv_t * instance,
	const char *name);
const char *clish_paramv_find_default(const clish_paramv_t * instance,
	const char *name);

#endif				/* _clish_param_h */
/** @} clish_param */