aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/ext_depends/D-YAML/examples/yaml_stats
diff options
context:
space:
mode:
Diffstat (limited to 'src/ext_depends/D-YAML/examples/yaml_stats')
-rw-r--r--src/ext_depends/D-YAML/examples/yaml_stats/dub.json10
-rw-r--r--src/ext_depends/D-YAML/examples/yaml_stats/small.yaml4
-rw-r--r--src/ext_depends/D-YAML/examples/yaml_stats/yaml_stats.d106
3 files changed, 120 insertions, 0 deletions
diff --git a/src/ext_depends/D-YAML/examples/yaml_stats/dub.json b/src/ext_depends/D-YAML/examples/yaml_stats/dub.json
new file mode 100644
index 0000000..c86f091
--- /dev/null
+++ b/src/ext_depends/D-YAML/examples/yaml_stats/dub.json
@@ -0,0 +1,10 @@
+{
+ "name": "yaml_stats",
+ "targetType": "executable",
+ "sourceFiles": ["yaml_stats.d"],
+ "mainSourceFile": "yaml_stats.d",
+ "dependencies":
+ {
+ "dyaml": { "version" : "*" }
+ }
+}
diff --git a/src/ext_depends/D-YAML/examples/yaml_stats/small.yaml b/src/ext_depends/D-YAML/examples/yaml_stats/small.yaml
new file mode 100644
index 0000000..4f5c0ea
--- /dev/null
+++ b/src/ext_depends/D-YAML/examples/yaml_stats/small.yaml
@@ -0,0 +1,4 @@
+- 1
+- 2 : 'a'
+ 3 : 'b'
+- 4 : [1.0, 2.1, 3.2]
diff --git a/src/ext_depends/D-YAML/examples/yaml_stats/yaml_stats.d b/src/ext_depends/D-YAML/examples/yaml_stats/yaml_stats.d
new file mode 100644
index 0000000..b3f6c17
--- /dev/null
+++ b/src/ext_depends/D-YAML/examples/yaml_stats/yaml_stats.d
@@ -0,0 +1,106 @@
+
+///Example D:YAML application that displays statistics about YAML documents.
+
+import std.stdio;
+import std.string;
+import dyaml;
+
+
+///Collects statistics about a YAML document and returns them as string.
+string statistics(ref Node document)
+{
+ size_t nodes;
+ size_t scalars, sequences, mappings;
+ size_t seqItems, mapPairs;
+
+ size_t[string] tags;
+
+ void crawl(ref Node root)
+ {
+ ++nodes;
+ if((root.tag in tags) is null)
+ {
+ tags[root.tag] = 0;
+ }
+ ++tags[root.tag];
+ final switch (root.nodeID)
+ {
+ 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);
+ }
+ }
+
+ crawl(document);
+
+ string tagStats = "\nTag statistics:\n";
+ foreach(tag, count; tags)
+ {
+ tagStats ~= format("\n%s : %s", tag, count);
+ }
+
+ return format( "\nNodes: %s" ~
+ "\n\nScalars: %s" ~
+ "\nSequences: %s" ~
+ "\nMappings: %s" ~
+ "\n\nAverage sequence length: %s" ~
+ "\nAverage mapping length: %s" ~
+ "\n\n%s",
+ nodes, scalars, sequences, mappings,
+ sequences == 0.0 ? 0.0 : cast(real)seqItems / sequences,
+ mappings == 0.0 ? 0.0 : cast(real)mapPairs / mappings,
+ tagStats);
+}
+
+void main(string[] args)
+{
+ //Help message
+ if(args.length == 1)
+ {
+ writeln("Usage: yaml_stats [YAML_FILE ...]\n");
+ writeln("Analyzes YAML files with provided filenames and displays statistics.");
+ return;
+ }
+
+ //Print stats about every document in every file.
+ foreach(file; args[1 .. $])
+ {
+ writeln("\nFile ", file);
+ writeln("------------------------------------------------------------");
+ try
+ {
+ auto loader = Loader.fromFile(file);
+
+ size_t idx = 0;
+ foreach(ref document; loader)
+ {
+ writeln("\nDocument ", idx++);
+ writeln("----------------------------------------");
+ writeln(statistics(document));
+ }
+ }
+ catch(YAMLException e)
+ {
+ writeln("ERROR: ", e.msg);
+ }
+ }
+}