#ifndef ZLG_CONFIG_INTF_H
#define ZLG_CONFIG_INTF_H

struct _Meta;
struct _Pair;
struct _Options;
struct _ConfigNode;

typedef struct _Meta Meta;
typedef struct _Pair Pair;
typedef struct _Options Options;
typedef struct _ConfigNode ConfigNode;

/**
 *  \struct Options
 * 节点mata的可选项。
 */
struct _Options
{
	/*! 可选项的数据类型*/
	const char * type;

	/*! 可选项的值*/
	const char * value;

	/*! 可选项的描述信息*/
	const char * desc;
};

/**
 *  \struct Meta
 * 节点mata信息。
 */
struct _Meta
{
	/*! 配置项的数据类型 */
	const char * type;

	/*! 配置项的说明性信息 */
	const char * desc;

	/*! 配置项是否是只读的，缺省为可读写 */
	int read_only;

	/*! 配置项输入格式的提示 */
	const char * format;

	/*! 对于数值类型的配置项来说是最小值，对字符串的配置项来说是最小长度（字节数）。 */
	double min_value;

	/*! 对于数值类型的配置项来说是最大值，对字符串的配置项来说是最大长度（字节数）。 */
	double max_value;

	/*! 配置项的单位 */
	const char * unit;

	/*! 通过旋钮/滚轮等方式修改配置项时的增量 */
	double delta;

    /*! 配置项是否可见, true可见，false不可见，也可以绑定表达式（表达式使用参考demo3），缺省可见 */
    const char* visible;
    
    /*! 该配置项是否使能, true使能，false不使能，也可以绑定表达式（表达式使用参考demo3）。缺省使能 */
    const char* enable;

	/*! 配置项的可选值，仅但『type』为间接类型时有效 */
	int editable;

	/*! 配置项的可选值，仅但『type』为间接类型时有效，以NULL结束 */
	Options** options;
};

/**
 *  \struct Pair
 *  属性的KeyValue对。
 */
struct _Pair
{
	const char * key;
	const char * value;
};

/**
 *  \struct ConfigNode 
 *  ConfigNode
 */
struct _ConfigNode
{
	/*! 节点的名字 */
	const char * name;
	/*! 节点的值 同样可以绑定表达式*/
	const char * value;
    /*! 节点值的表达式，当有该表达式时，value由此表达式计算而来*/
    const char* binding_value;
	/*! 该节点的路径 */
	const char * path;
	/*! 配置项信息 */
	Meta* meta_info;
	/*! 该节点的子节点, 以NULL结束*/
	ConfigNode** children;
	/*! 该节点的属性, 以NULL结束*/
	Pair** attributes;
};

/**
 * \brief 获取属性的描述信息。
 *
 * \retval ConfigNode
 */
typedef const ConfigNode* (*GetPropertysFunc)();

/**
 * \brief 设置指定路径的属性的值。
 * \param[in] path  : 属性的路径。
 * \param[in] value : 属性的值。
 *
 * \retval 成功返回1，失败返回0。
 */
typedef int (*SetValueFunc)(const char* path, const char* value);

/**
 * \brief 获取指定路径的属性的值。
 * \param[in] path  : 属性的路径。
 * \retval 成功返回属性的值，失败返回NULL。
 */
typedef const char* (*GetValueFunc)(const char* path);

typedef struct  tagIProperty
{
	SetValueFunc     SetValue;
	GetValueFunc     GetValue;
	GetPropertysFunc GetPropertys;
}IProperty;

#endif/*ZLG_CONFIG_INTF_H*/

