diff src/docgen/config/configurator.d @ 806:bcb74c9b895c

Moved out files in the trunk folder to the root.
author Aziz K?ksal <aziz.koeksal@gmail.com>
date Sun, 09 Mar 2008 00:12:19 +0100
parents trunk/src/docgen/config/configurator.d@cb8edb09108a
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/docgen/config/configurator.d	Sun Mar 09 00:12:19 2008 +0100
@@ -0,0 +1,81 @@
+/**
+ * Author: Jari-Matti Mäkelä
+ * License: GPL3
+ */
+module docgen.config.configurator;
+
+import docgen.config.reader;
+import docgen.config.reflection;
+import docgen.misc.options;
+
+import Integer = tango.text.convert.Integer;
+import tango.io.stream.FileStream;
+import tango.io.Stdout;
+
+/**
+ * Class for handling and merging doc generator options.
+ */
+interface Configurator {
+  /**
+   * Merges configuration options from the given file.
+   */
+  void mergeConfiguration(char[] cfgFile);
+  
+  /**
+   * Returns a hierarchical structure of configuration options.
+   */
+  DocGeneratorOptions *getConfiguration();
+}
+
+private DocGeneratorOptions options;
+private Struct!(options) opt;
+private const cases = makeTypeStringForStruct!(opt);
+
+class DefaultConfigurator : Configurator {
+  private:
+    
+  DocGeneratorOptions options;
+
+  public:
+
+  const defaultProfileLocation = "docgen/config/default.cfg";
+
+  this() {
+    mergeConfiguration(defaultProfileLocation);
+  }
+
+  this(char[] cfgFile) {
+    this();
+    mergeConfiguration(cfgFile);
+  }
+
+  void mergeConfiguration(char[] cfgFile) {
+    
+    auto inputStream = new FileInput(cfgFile);
+    auto content = new char[inputStream.length];
+    auto bytesRead = inputStream.read (content);
+    
+    assert(bytesRead == inputStream.length, "Error reading configuration file");
+
+    auto tokens = lex(content);
+    auto configuration = parse(tokens);
+
+    foreach(key, val; configuration) {
+      bool err() {
+        throw new Exception(
+          "Configurator: Invalid key-val pair " ~ key ~
+          "=" ~ (val.length ? val[0] : "null"));
+      }
+
+      // cuteness, lul
+      mixin(_switch(
+        mixin(cases) ~
+        `default: throw new Exception("Illegal configuration key " ~ key);`
+      ));
+    }
+  }
+
+  DocGeneratorOptions *getConfiguration() {
+    return &options;
+  }
+}