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:
Cameron Ross 2019-01-27 22:26:00 -03:30 committed by Basile-z
parent bbfe2bbb69
commit b63ea1aaae
9 changed files with 505 additions and 453 deletions

View file

@ -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;
}

View file

@ -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);
}
}

View file

@ -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);
}
}