using GLib; namespace Test { public class ConfigData : GLib.Object { public string interfaces { get; set; } public int retries { get; set; } } public class ConfigParser { public static T parse(string path) { var data = Object new (typeof(T)); hydrate_from_path (path, data); return (T)data; } private static void hydrate_from_path(string path, GLib.Object data) { unowned GLib.ObjectClass clazz = (GLib.ObjectClass) data.get_type ().class_peek (); print ("Hydrating class '%s' from file: '%s'\n", data.get_type ().name (), path); try { var file = new GLib.IOChannel.file (path, "r"); string line; size_t len, pos; while (file.read_line (out line, out len, out pos) == IOStatus.NORMAL) { string[] tokens = line.split ("="); if (tokens.length != 2) { error ("Invalid input."); } GLib.ParamSpec spec = clazz.find_property (tokens[0]); if (spec != null) { if (spec.value_type.is_a (typeof(int))) { data.set_property (tokens[0], int.parse (tokens[1])); } else if (spec.value_type.is_a (typeof(string))) { data.set_property (tokens[0], tokens[1].substring(0, tokens[1].length-1)); } else { error ("Unsupported type '%s' for property '%s'.", spec.value_type.name (), tokens[0]); } } else { print ("*** Unknown property '%s'.\n", tokens[0]); } } } catch (Error e) { critical (e.message); } print ("Parse done.\n\n"); } } public static void main (string[] args) { if (args.length != 2) { print ("%s \n", args[0]); return; } var data = ConfigParser.parse (args[1]); print ("Interfaces: %s\n", data.interfaces); print ("Retries: %d\n", data.retries); } }