Browse Source

add function - toml config and default values

221V 1 month ago
parent
commit
5668e28073
1 changed files with 69 additions and 4 deletions
  1. 69 4
      source/dopp.d

+ 69 - 4
source/dopp.d

@@ -10,6 +10,7 @@ public{
   import std.ascii : isDigit;
   import std.ascii : isDigit;
   import std.conv : to;
   import std.conv : to;
   import std.algorithm;
   import std.algorithm;
+  import std.sumtype : SumType;
 }
 }
 
 
 //import dopp_lexer : tokenize, isKeyword;
 //import dopp_lexer : tokenize, isKeyword;
@@ -49,7 +50,6 @@ export struct Token{
 // ./dopp -f test.de -o test.d == input file name + output file name (default output file name = input file name [but .d instead .de] )
 // ./dopp -f test.de -o test.d == input file name + output file name (default output file name = input file name [but .d instead .de] )
 // ./dopp -f "/test/test.de" -o "/result/test.d" == input file path + output file path (default output file name and path = input file name and path [but .d instead .de] )
 // ./dopp -f "/test/test.de" -o "/result/test.d" == input file path + output file path (default output file name and path = input file name and path [but .d instead .de] )
 bool is_valid_argv(ref string[] argv){
 bool is_valid_argv(ref string[] argv){
-  //ulong num = argv[1 .. $].length; // uint64
   ulong num = argv.length; // uint64
   ulong num = argv.length; // uint64
   if(num != 1 && num != 2 && num != 4){
   if(num != 1 && num != 2 && num != 4){
     return false;
     return false;
@@ -108,16 +108,81 @@ bool is_valid_argv(ref string[] argv){
 }
 }
 
 
 
 
+//alias Config_Value = SumType!(string, int, ubyte, bool);
+alias Config_Value = SumType!(string, ubyte, bool);
+
+Config_Value get_config_value(ref TOMLDocument toml_s, string key){
+  if(key == "indent_matter"){
+    ubyte default_indent_matter = 4;
+    if(("indent_matter" in toml_s) != null){
+      if(toml_s[key].type == TOMLType.INTEGER){
+        ubyte indent_matter = cast(ubyte) toml_s[key].integer; // long (int64) -> ubyte (uint8) // todo add alias
+        if(indent_matter > 0){
+          return Config_Value(indent_matter);
+        }
+      }
+    }
+    writeln("Warning: use default indent_matter = ", default_indent_matter); // todo add config key-value "no_warn" = false | true for silence
+    return Config_Value(default_indent_matter);
+  
+  }else if(key == "indent_out"){
+    ubyte default_indent_out = 2;
+    if(("indent_out" in toml_s) != null){
+      if(toml_s[key].type == TOMLType.INTEGER){
+        ubyte indent_out = cast(ubyte) toml_s[key].integer; // long (int64) -> ubyte (uint8)
+        if(indent_out > 0){
+          return Config_Value(indent_out);
+        }
+      }
+    }
+    writeln("Warning: use default indent_out = ", default_indent_out);
+    return Config_Value(default_indent_out);
+  
+  }else if(key == "indent_type"){ // 0 = whitespaces, 1 = tabs
+    ubyte default_indent_type = 0;
+    if(("indent_type" in toml_s) != null){
+      if(toml_s[key].type == TOMLType.INTEGER){
+        ubyte indent_type = cast(ubyte) toml_s[key].integer; // long (int64) -> ubyte (uint8)
+        if(indent_type < 2){ // 0 | 1
+          return Config_Value(indent_type);
+        }
+      }
+    }
+    writeln("Warning: use default indent_type = ", default_indent_type);
+    return Config_Value(default_indent_type);
+  
+  //}else{}
+  
+  }
+  return Config_Value(0);
+}
+
 
 
 //void main(string[] argv){
 //void main(string[] argv){
 int main(string[] argv){
 int main(string[] argv){
   
   
   toml_s = parseTOML(cast(string)read("dopp.toml"));
   toml_s = parseTOML(cast(string)read("dopp.toml"));
+  
+  /*
   writeln("indent_matter: ", toml_s["indent_matter"]); // 4
   writeln("indent_matter: ", toml_s["indent_matter"]); // 4
   //writeln("xyz: ", toml_s["xyz"]); // Address boundary error || Segmentation fault (core dumped)
   //writeln("xyz: ", toml_s["xyz"]); // Address boundary error || Segmentation fault (core dumped)
-  writeln("indent_matter in: ", "indent_matter" in toml_s);
-  writeln("xyz in: ", "xyz" in toml_s);
-  // todo function - config and default values
+  writeln("indent_matter in: ", "indent_matter" in toml_s); // hex like 7F27C2992040
+  writeln("indent_matter is null: ", ("indent_matter" in toml_s) == null); // fasle
+  writeln("indent_matter is TOMLType.INTEGER: ", (toml_s["indent_matter"].type == TOMLType.INTEGER)); // true
+  writeln("xyz in: ", "xyz" in toml_s); // null
+  writeln("xyz is null: ", ("xyz" in toml_s) == null); // true
+  */
+  
+  
+  auto indent_type = get_config_value(toml_s, "indent_type");
+  writeln("config: indent_type = ", indent_type); // 0
+  
+  auto indent_matter = get_config_value(toml_s, "indent_matter");
+  writeln("config: indent_matter = ", indent_matter); // 4
+  
+  auto indent_out = get_config_value(toml_s, "indent_out");
+  writeln("config: indent_out = ", indent_out); // 2
+  
   
   
   /*
   /*
   int i = 0;
   int i = 0;