 /* swig.i */
 %module(package="libplist") PList
 %feature("autodoc", "1");
 %{
 /* Includes the header in the wrapper code */
 #include <plist/plist.h>
typedef struct {
	plist_t node;
} PListNode;
 %}

%include "stdint.i"

/* Parse the header file to generate wrappers */
typedef enum {
	PLIST_BOOLEAN,
	PLIST_UINT,
	PLIST_REAL,
	PLIST_STRING,
	PLIST_UNICODE,
	PLIST_ARRAY,
	PLIST_DICT,
	PLIST_DATE,
	PLIST_DATA,
	PLIST_KEY,
	PLIST_NONE
} plist_type;

typedef struct {
	plist_t node;
} PListNode;

%extend PListNode {             // Attach these functions to struct Vector
	PListNode(plist_type t) {
		PListNode* node = NULL;
		switch (t) {
			case PLIST_ARRAY :
				node = (PListNode*) malloc(sizeof(PListNode));
				node->node = plist_new_array();
				break;
			case PLIST_DICT :
				node = (PListNode*) malloc(sizeof(PListNode));
				node->node = plist_new_dict();
				break;
			default :
				node = NULL;
				break;
		}
		return node;
	}

	PListNode(char* xml) {
		PListNode* plist = (PListNode*) malloc(sizeof(PListNode));
		plist_from_xml(xml, strlen(xml), &plist->node);
		return plist;
	}

	PListNode(char* bin, uint64_t len) {
		PListNode* plist = (PListNode*) malloc(sizeof(PListNode));
		plist_from_bin(bin, len, &plist->node);
		return plist;
	}

	~PListNode() {
		plist_free($self->node);
		free($self);
	}

	void AddSubNode(PListNode* subnode) {
		plist_add_sub_node($self->node, subnode);
	}

	void add_sub_key(char* k) {
		plist_add_sub_key_el($self->node, k);
	}

	void add_sub_string(char* s) {
		plist_add_sub_string_el($self->node, s);
	}

	void add_sub_bool(char b) {
		plist_add_sub_bool_el($self->node, b);
	}

	void add_sub_uint(uint64_t i) {
		plist_add_sub_uint_el($self->node, i);
	}

	void add_sub_real(double d) {
		plist_add_sub_real_el($self->node, d);
	}

	void add_sub_data(char* v, uint64_t l) {
		plist_add_sub_data_el($self->node, v, l);
	}

	PListNode* get_first_child() {
		PListNode* plist = (PListNode*) malloc(sizeof(PListNode));
		plist_get_first_child(&$self->node);
		return plist;
	}

	PListNode* get_next_sibling() {
		PListNode* plist = (PListNode*) malloc(sizeof(PListNode));
		plist_get_next_sibling(&$self->node);
		return plist;
	}

	PListNode* get_prev_sibling() {
		PListNode* plist = (PListNode*) malloc(sizeof(PListNode));
		plist_get_prev_sibling(&$self->node);
		return plist;
	}

	char* as_key() {
		char* k = NULL;
		plist_get_key_val($self->node, &k);
		return k;
	}

	char* as_string() {
		char* s = NULL;
		plist_get_string_val($self->node, &s);
		return s;
	}

	char as_bool() {
		char b;
		plist_get_bool_val($self->node, &b);
		return b;
	}

	uint64_t as_uint() {
		uint64_t i = 0;
		plist_get_uint_val($self->node, &i);
		return i;
	}

	double as_real() {
		double d = 0;
		plist_get_real_val($self->node, &d);
		return d;
	}

	char* as_data() {
		char* v;
		uint64_t l;
		plist_get_data_val($self->node, &v, &l);
		return v;
	}

	plist_type get_type() {
		return plist_get_node_type($self->node);
	}

	PListNode* find_sub_node_by_string(char* s) {
		PListNode* plist = (PListNode*) malloc(sizeof(PListNode));
		plist = plist_find_node_by_string($self->node, s);
		return plist;
	}

	char* to_xml () {
		char* s = NULL;
		uint32_t l;
		plist_to_xml($self->node, &s, &l);
		return s;
	}

	char* to_bin () {
		char* s = NULL;
		uint32_t l;
		plist_to_bin($self->node, &s, &l);
		return s;
	}
};

