abraunegg-onedrive/src/config.d
2015-09-01 20:47:44 +02:00

65 lines
1.1 KiB
D

import std.regex, std.stdio, std.file;
final class Config
{
private string filename;
private string[string] values;
this(string filename)
{
this.filename = filename;
load();
}
string get(string key)
{
return values[key];
}
void set(string key, string value)
{
values[key] = value;
}
void load()
{
values = null;
scope (failure) return;
auto file = File(filename, "r");
auto r = regex("(?:^\\s*)(\\w+)(?:\\s*=\\s*\")(.*)(?:\"\\s*$)");
foreach (line; file.byLine()) {
auto c = matchFirst(line, r);
if (!c.empty) {
c.popFront(); // skip whole match
string key = c.front.dup;
c.popFront();
values[key] = c.front.dup;
}
}
}
void save()
{
if (exists(filename)) {
string bkpFilename = filename ~ "~";
rename(filename, bkpFilename);
}
auto file = File(filename, "w");
foreach (key, value; values) {
file.writeln(key, " = \"", value, "\"");
}
}
}
unittest
{
auto cfg = new Config("/tmp/test.conf");
cfg.set("test1", "1");
cfg.set("test2", "2");
cfg.set("test1", "3");
cfg.save();
cfg.load();
assert(cfg.get("test1") == "3");
assert(cfg.get("test2") == "2");
}