/home/i/wrk/d/bogoyaml/bogoyaml_static.d

module bogoyaml_static;

import bogoyaml;

template ToStatic(T) {}

template ToStatic(T : T[char[]]) {
	T[char[]] conv(YamlHolder yaml) {
		T[char[]] ret;
		alias ToStatic!(T) NextToStatic;
		foreach (char[] key; yaml.assoc.keys) {
			T tmp = NextToStatic.conv(yaml.get(key));
			ret[key] = tmp;
		}
		return ret;
	}
}

template ToStatic(T : T[]) {
	T[] conv(YamlHolder yaml) {
		T[] ret;
		alias ToStatic!(T) NextToStatic;
		foreach (YamlHolder y; yaml.array()) {
			T tmp = NextToStatic.conv(y);
			ret ~= tmp;
		}
		return ret;
	}
}

template ToStatic(T : char[]) {
	char[] conv(YamlHolder yaml) {
		return yaml.str();
	}
}

template ToStatic(T : int) {
	int conv(YamlHolder yaml) {
		return yaml.integer();
	}
}

template ToStatic(T : double) {
	double conv(YamlHolder yaml) {
		return yaml.decimal();
	}
}

template FromStatic(T) {}

template FromStatic(T : T[char[]]) {
	YamlHolder conv(T[char[]] assoc) {
		YamlAssoc ret = new YamlAssoc();
		YamlHolder[char[]] a = ret.assoc;
		foreach (char[] key; assoc.keys) {
			alias FromStatic!(T) NextFromStatic;
			a[key] = NextFromStatic.conv(assoc[key]);
		}
		ret.assoc = a;
		return ret;
	}
}

template FromStatic(T : T[]) {
	YamlHolder conv(T[] array) {
		YamlArray ret = new YamlArray();
		YamlHolder[] a = ret.array;
		foreach (T val; array) {
			alias FromStatic!(T) NextFromStatic;
			a ~= NextFromStatic.conv(val);
		}
		ret.array = a;
		return ret;
	}
}

template FromStatic(T : char[]) {
	YamlHolder conv(char[] str) {
		return new YamlScalar(str);
	}
}

template FromStatic(T : int) {
	YamlHolder conv(int i) {
		return new YamlScalar(i);
	}
}

template FromStatic(T : double) {
	YamlHolder conv(double d) {
		return new YamlScalar(d);
	}
}