make node types into enums and clean up code using them (#225)
* make node types into enums and clean up code using them * add some tests for anchorable
This commit is contained in:
parent
bbfe2bbb69
commit
b63ea1aaae
9 changed files with 505 additions and 453 deletions
|
@ -14,41 +14,41 @@ void main()
|
|||
JSONValue toJSON(Node node)
|
||||
{
|
||||
JSONValue output;
|
||||
if (node.isSequence)
|
||||
final switch (node.type)
|
||||
{
|
||||
output = JSONValue(string[].init);
|
||||
foreach (Node seqNode; node)
|
||||
{
|
||||
output.array ~= seqNode.toJSON();
|
||||
}
|
||||
}
|
||||
else if (node.isMapping)
|
||||
{
|
||||
output = JSONValue(string[string].init);
|
||||
foreach (Node keyNode, Node valueNode; node)
|
||||
{
|
||||
output[keyNode.as!string] = valueNode.toJSON();
|
||||
}
|
||||
}
|
||||
else if (node.isString)
|
||||
{
|
||||
output = node.as!string;
|
||||
}
|
||||
else if (node.isInt)
|
||||
{
|
||||
output = node.as!long;
|
||||
}
|
||||
else if (node.isFloat)
|
||||
{
|
||||
output = node.as!real;
|
||||
}
|
||||
else if (node.isBool)
|
||||
{
|
||||
output = node.as!bool;
|
||||
}
|
||||
else if (node.isTime)
|
||||
{
|
||||
output = node.as!SysTime.toISOExtString();
|
||||
case NodeType.sequence:
|
||||
output = JSONValue(string[].init);
|
||||
foreach (Node seqNode; node)
|
||||
{
|
||||
output.array ~= seqNode.toJSON();
|
||||
}
|
||||
break;
|
||||
case NodeType.mapping:
|
||||
output = JSONValue(string[string].init);
|
||||
foreach (Node keyNode, Node valueNode; node)
|
||||
{
|
||||
output[keyNode.as!string] = valueNode.toJSON();
|
||||
}
|
||||
break;
|
||||
case NodeType.string:
|
||||
output = node.as!string;
|
||||
break;
|
||||
case NodeType.integer:
|
||||
output = node.as!long;
|
||||
break;
|
||||
case NodeType.decimal:
|
||||
output = node.as!real;
|
||||
break;
|
||||
case NodeType.boolean:
|
||||
output = node.as!bool;
|
||||
break;
|
||||
case NodeType.timestamp:
|
||||
output = node.as!SysTime.toISOExtString();
|
||||
break;
|
||||
case NodeType.merge:
|
||||
case NodeType.null_:
|
||||
case NodeType.binary:
|
||||
case NodeType.invalid:
|
||||
}
|
||||
return output;
|
||||
}
|
||||
|
|
|
@ -18,25 +18,36 @@ void extract(ref Node document) @safe
|
|||
{
|
||||
void crawl(ref Node root) @safe
|
||||
{
|
||||
if(root.isScalar) switch(root.tag)
|
||||
final switch (root.nodeID)
|
||||
{
|
||||
case "tag:yaml.org,2002:null": auto value = root.as!YAMLNull; break;
|
||||
case "tag:yaml.org,2002:bool": auto value = root.as!bool; break;
|
||||
case "tag:yaml.org,2002:int": auto value = root.as!long; break;
|
||||
case "tag:yaml.org,2002:float": auto value = root.as!real; break;
|
||||
case "tag:yaml.org,2002:binary": auto value = root.as!(ubyte[]); break;
|
||||
case "tag:yaml.org,2002:timestamp": auto value = root.as!SysTime; break;
|
||||
case "tag:yaml.org,2002:str": auto value = root.as!string; break;
|
||||
default: writeln("Unrecognozed tag: ", root.tag);
|
||||
}
|
||||
else if(root.isSequence) foreach(ref Node node; root)
|
||||
{
|
||||
crawl(node);
|
||||
}
|
||||
else if(root.isMapping) foreach(ref Node key, ref Node value; root)
|
||||
{
|
||||
crawl(key);
|
||||
crawl(value);
|
||||
case NodeID.scalar:
|
||||
switch(root.tag)
|
||||
{
|
||||
case "tag:yaml.org,2002:null": auto value = root.as!YAMLNull; break;
|
||||
case "tag:yaml.org,2002:bool": auto value = root.as!bool; break;
|
||||
case "tag:yaml.org,2002:int": auto value = root.as!long; break;
|
||||
case "tag:yaml.org,2002:float": auto value = root.as!real; break;
|
||||
case "tag:yaml.org,2002:binary": auto value = root.as!(ubyte[]); break;
|
||||
case "tag:yaml.org,2002:timestamp": auto value = root.as!SysTime; break;
|
||||
case "tag:yaml.org,2002:str": auto value = root.as!string; break;
|
||||
default: writeln("Unrecognozed tag: ", root.tag);
|
||||
}
|
||||
break;
|
||||
case NodeID.sequence:
|
||||
foreach(ref Node node; root)
|
||||
{
|
||||
crawl(node);
|
||||
}
|
||||
break;
|
||||
case NodeID.mapping:
|
||||
foreach(ref Node key, ref Node value; root)
|
||||
{
|
||||
crawl(key);
|
||||
crawl(value);
|
||||
}
|
||||
break;
|
||||
case NodeID.invalid:
|
||||
assert(0);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -23,32 +23,30 @@ string statistics(ref Node document)
|
|||
tags[root.tag] = 0;
|
||||
}
|
||||
++tags[root.tag];
|
||||
|
||||
if(root.isScalar)
|
||||
final switch (root.nodeID)
|
||||
{
|
||||
++scalars;
|
||||
return;
|
||||
}
|
||||
if(root.isSequence)
|
||||
{
|
||||
++sequences;
|
||||
seqItems += root.length;
|
||||
foreach(ref Node node; root)
|
||||
{
|
||||
crawl(node);
|
||||
}
|
||||
return;
|
||||
}
|
||||
if(root.isMapping)
|
||||
{
|
||||
++mappings;
|
||||
mapPairs += root.length;
|
||||
foreach(ref Node key, ref Node value; root)
|
||||
{
|
||||
crawl(key);
|
||||
crawl(value);
|
||||
}
|
||||
return;
|
||||
case NodeID.scalar:
|
||||
++scalars;
|
||||
return;
|
||||
case NodeID.sequence:
|
||||
++sequences;
|
||||
seqItems += root.length;
|
||||
foreach(ref Node node; root)
|
||||
{
|
||||
crawl(node);
|
||||
}
|
||||
return;
|
||||
case NodeID.mapping:
|
||||
++mappings;
|
||||
mapPairs += root.length;
|
||||
foreach(ref Node key, ref Node value; root)
|
||||
{
|
||||
crawl(key);
|
||||
crawl(value);
|
||||
}
|
||||
return;
|
||||
case NodeID.invalid:
|
||||
assert(0);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue