From 3794af72b271092f47d25a09b627f3d4070bb799 Mon Sep 17 00:00:00 2001 From: a-sansara Date: Thu, 6 Sep 2018 18:46:44 +0200 Subject: [PATCH] add minimal Gee.HashMap support --- resources/tag.yml | 32 ++++++++ samples/yaml-serialize.vala | 55 ++++++------- samples/yaml-tag.vala | 25 ++++++ src/vala/Pluie/Samples.YamlObject.vala | 109 ++++++++++++++++++------- src/vala/Pluie/Yaml.Object.vala | 49 +++++++++-- src/vala/Pluie/Yaml.global.vala | 9 +- 6 files changed, 209 insertions(+), 70 deletions(-) diff --git a/resources/tag.yml b/resources/tag.yml index 77de1ca..e64f03e 100644 --- a/resources/tag.yml +++ b/resources/tag.yml @@ -43,3 +43,35 @@ tata : tatavalue4 titi : 44 tutu : 0 + !v!Gee.HashMap type_gee_hmap : + - key : key1 + !v!Pluie.Samples.YamlChild val : + toto : key1toto + tata : kay1tata + titi : 5 + tutu : 0 + - key : key2 + val : + toto : key2toto + tata : kay2tata + titi : 46 + tutu : 1 + !v!Gee.HashMap type_gee_hmap2 : + - !v!Pluie.Samples.YamlStruct key : + red : !v!uint8 214 + green : !v!uint8 78 + blue : 153 + !v!Pluie.Samples.YamlChild val : + toto : key1toto + tata : kay1tata + titi : 5 + tutu : 0 + - key : + red : !v!uint8 82 + green : !v!uint8 109 + blue : 35 + val : + toto : key2toto + tata : kay2tata + titi : 46 + tutu : 1 diff --git a/samples/yaml-serialize.vala b/samples/yaml-serialize.vala index ee6811d..4b2b74a 100644 --- a/samples/yaml-serialize.vala +++ b/samples/yaml-serialize.vala @@ -27,36 +27,6 @@ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *^*/ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * @software : pluie-yaml - * @version : 0.5 - * @type : library - * @date : 2018 - * @licence : GPLv3.0 - * @author : a-Sansara <[dev]at[pluie]dot[org]> - * @copyright : pluie.org - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * This file is part of pluie-yaml. - * - * pluie-yaml is free software (free as in speech) : you can redistribute it - * and/or modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation, either version 3 of the License, - * or (at your option) any later version. - * - * pluie-yaml is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License - * along with pluie-yaml. If not, see . - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - */ - using GLib; using Gee; using Pluie; @@ -97,6 +67,31 @@ public void test_object(Samples.YamlObject obj) of.keyval(" tutu" , "%s (bool)" .printf(child.tutu.to_string ())); child.method_a (); } + if (obj.type_gee_hmap != null) { + of.keyval("type_gee_hmap", "(%s<%s, %s>)" .printf(obj.type_gee_hmap.get_type ().name (), obj.type_gee_hmap.key_type.name (), obj.type_gee_hmap.value_type.name ())); + foreach (var child in obj.type_gee_hmap.entries) { + of.echo(" == entry (%s) ==".printf(child.key)); + of.keyval(" toto" , "%s (string)" .printf(child.value.toto)); + of.keyval(" tapa" , "%s (string)" .printf(child.value.tata)); + of.keyval(" titi" , "%d (int)" .printf(child.value.titi)); + of.keyval(" tutu" , "%s (bool)" .printf(child.value.tutu.to_string ())); + } + } + if (obj.type_gee_hmap2 != null) { + of.keyval("type_gee_hmap", "(%s<%s, %s>)" .printf(obj.type_gee_hmap2.get_type ().name (), obj.type_gee_hmap2.key_type.name (), obj.type_gee_hmap2.value_type.name ())); + foreach (var child in obj.type_gee_hmap2.entries) { + of.echo(" == key =="); + of.keyval(" obj :" , "%s" .printf(child.key.to_string ())); + of.echo(" == val (%s) ==".printf(child.value.get_type ( ).name ())); + of.keyval(" toto" , "%s (string)" .printf(child.value.toto)); + of.keyval(" tapa" , "%s (string)" .printf(child.value.tata)); + of.keyval(" titi" , "%d (int)" .printf(child.value.titi)); + of.keyval(" tutu" , "%s (bool)" .printf(child.value.tutu.to_string ())); + } + } + else { + of.echo ("hmap2 null"); + } } } diff --git a/samples/yaml-tag.vala b/samples/yaml-tag.vala index dfd140c..c53fe19 100644 --- a/samples/yaml-tag.vala +++ b/samples/yaml-tag.vala @@ -129,6 +129,31 @@ int main (string[] args) child.method_a (); } } + if (o.type_gee_hmap != null) { + of.keyval("type_gee_hmap", "(%s<%s, %s>)" .printf(o.type_gee_hmap.get_type ().name (), o.type_gee_hmap.key_type.name (), o.type_gee_hmap.value_type.name ())); + foreach (var child in o.type_gee_hmap.entries) { + of.echo(" == entry (%s) ==".printf(child.key)); + of.keyval(" toto" , "%s (string)" .printf(child.value.toto)); + of.keyval(" tapa" , "%s (string)" .printf(child.value.tata)); + of.keyval(" titi" , "%d (int)" .printf(child.value.titi)); + of.keyval(" tutu" , "%s (bool)" .printf(child.value.tutu.to_string ())); + } + } + if (o.type_gee_hmap2 != null) { + of.keyval("type_gee_hmap", "(%s<%s, %s>)" .printf(o.type_gee_hmap2.get_type ().name (), o.type_gee_hmap2.key_type.name (), o.type_gee_hmap2.value_type.name ())); + foreach (var child in o.type_gee_hmap2.entries) { + of.echo(" == key =="); + of.keyval(" obj :" , "%s" .printf(child.key.to_string ())); + of.echo(" == val (%s) ==".printf(child.value.get_type ( ).name ())); + of.keyval(" toto" , "%s (string)" .printf(child.value.toto)); + of.keyval(" tapa" , "%s (string)" .printf(child.value.tata)); + of.keyval(" titi" , "%d (int)" .printf(child.value.titi)); + of.keyval(" tutu" , "%s (bool)" .printf(child.value.tutu.to_string ())); + } + } + else { + of.echo ("hmap2 null"); + } } } diff --git a/src/vala/Pluie/Samples.YamlObject.vala b/src/vala/Pluie/Samples.YamlObject.vala index c355a98..698387a 100644 --- a/src/vala/Pluie/Samples.YamlObject.vala +++ b/src/vala/Pluie/Samples.YamlObject.vala @@ -36,35 +36,37 @@ using Pluie; */ public class Pluie.Samples.YamlObject : Yaml.Object { - public string myname { get; set; } - public string type_string { get; set; } - public int type_int { get; set; } - public uint type_uint { get; set; } - public float type_float { get; set; } - public double type_double { get; set; } - public char type_char { get; set; } - public uchar type_uchar { get; set; } - public unichar type_unichar { get; set; } - public short type_short { get; set; } - public ushort type_ushort { get; set; } - public long type_long { get; set; } - public ulong type_ulong { get; set; } - public size_t type_size_t { get; set; } - public ssize_t type_ssize_t { get; set; } - public int8 type_int8 { get; set; } - public uint8 type_uint8 { get; set; } - public int16 type_int16 { get; set; } - public uint16 type_uint16 { get; set; } - public int32 type_int32 { get; set; } - public uint32 type_uint32 { get; set; } - public int64 type_int64 { get; set; } - public uint64 type_uint64 { get; set; } - public bool type_bool { get; set; } - public Samples.YamlChild type_object { get; set; } - public Yaml.NODE_TYPE type_enum { get; set; } - public Samples.YamlStruct type_struct { get; set; } - public Gee.ArrayList type_gee_al { get; set; } - public Gee.ArrayList type_gee_alobject { get; set; } + public string myname { get; set; } + public string type_string { get; set; } + public int type_int { get; set; } + public uint type_uint { get; set; } + public float type_float { get; set; } + public double type_double { get; set; } + public char type_char { get; set; } + public uchar type_uchar { get; set; } + public unichar type_unichar { get; set; } + public short type_short { get; set; } + public ushort type_ushort { get; set; } + public long type_long { get; set; } + public ulong type_ulong { get; set; } + public size_t type_size_t { get; set; } + public ssize_t type_ssize_t { get; set; } + public int8 type_int8 { get; set; } + public uint8 type_uint8 { get; set; } + public int16 type_int16 { get; set; } + public uint16 type_uint16 { get; set; } + public int32 type_int32 { get; set; } + public uint32 type_uint32 { get; set; } + public int64 type_int64 { get; set; } + public uint64 type_uint64 { get; set; } + public bool type_bool { get; set; } + public Samples.YamlChild type_object { get; set; } + public Yaml.NODE_TYPE type_enum { get; set; } + public Samples.YamlStruct type_struct { get; set; } + public Gee.ArrayList type_gee_al { get; set; } + public Gee.ArrayList type_gee_alobject { get; set; } + public Gee.HashMap type_gee_hmap { get; set; } + public Gee.HashMap type_gee_hmap2 { get; set; } /** * @@ -75,7 +77,8 @@ public class Pluie.Samples.YamlObject : Yaml.Object typeof (Samples.YamlObject), typeof (Samples.YamlChild), typeof (Samples.YamlStruct), - typeof (Gee.ArrayList) + typeof (Gee.ArrayList), + typeof (Gee.HashMap) ); } @@ -86,6 +89,8 @@ public class Pluie.Samples.YamlObject : Yaml.Object { this.type_gee_al = new Gee.ArrayList (); this.type_gee_alobject = new Gee.ArrayList (); + this.type_gee_hmap = new Gee.HashMap (); + this.type_gee_hmap2 = new Gee.HashMap (); Yaml.Register.add_namespace("Gee", "Pluie.Samples"); Dbg.msg ("%s (%s) instantiated".printf (this.yaml_name, this.get_type().name ()), Log.LINE, Log.FILE); } @@ -117,6 +122,24 @@ public class Pluie.Samples.YamlObject : Yaml.Object } } } + else if (type == typeof (Gee.HashMap)) { + Yaml.Mapping? c; + foreach (var child in node) { + c = child as Yaml.Mapping; + switch (name) { + case "type_gee_hmap": + Value key = c.item ("key").val (typeof (string)); + var entry = (Samples.YamlChild) Yaml.Builder.from_node (c.item ("val"), typeof (Samples.YamlChild)); + this.type_gee_hmap.set((string) key, entry); + break; + case "type_gee_hmap2": + var key = Samples.YamlStruct.from_yaml_node (c.item ("key")); + var entry = (Samples.YamlChild) Yaml.Builder.from_node (c.item ("val"), typeof (Samples.YamlChild)); + this.type_gee_hmap2.set(key, entry); + break; + } + } + } else { var obj = Yaml.Builder.from_node(node, type); if (name == "type_object") { @@ -147,9 +170,35 @@ public class Pluie.Samples.YamlObject : Yaml.Object break; } } + else if (type == typeof (Gee.HashMap)) { + switch (name) { + case "type_gee_hmap" : + Yaml.Object.objects_mapkstr_to_node (this.type_gee_hmap, name, parent); + break; + case "type_gee_hmap2" : + this.hmap2_to_node (name, parent); + break; + } + } else { base.populate_to_node (name, type, parent); } return node; } + + /** + * + */ + public void hmap2_to_node (string name, Yaml.Node? parent = null) + { + of.echo (Log.METHOD); + var node = new Yaml.Sequence (parent, name); + node.tag = new Yaml.Tag (Yaml.Register.resolve_namespace_type(this.type_gee_hmap2.get_type ()), "v"); + var i = 0; + foreach (var child in this.type_gee_hmap2.entries) { + var entryNode = new Yaml.Mapping (node, "_%d".printf (i)); + entryNode.add (child.key.to_yaml_node ("key")); + Yaml.Builder.to_node ((GLib.Object) child.value, entryNode, false, null, "val"); + } + } } diff --git a/src/vala/Pluie/Yaml.Object.vala b/src/vala/Pluie/Yaml.Object.vala index 765a60f..fe62308 100644 --- a/src/vala/Pluie/Yaml.Object.vala +++ b/src/vala/Pluie/Yaml.Object.vala @@ -127,18 +127,53 @@ public abstract class Pluie.Yaml.Object : GLib.Object */ public static Yaml.Node? objects_collection_to_node (Gee.Collection list, string name, Yaml.Node? parent = null) { - of.echo (Log.METHOD); var node = new Yaml.Sequence (parent, name); node.tag = new Yaml.Tag (Yaml.Register.resolve_namespace_type(list.get_type ()), "v"); var it = list.iterator (); var i = 0; while (it.next ()) { - Yaml.Builder.to_node ( - (GLib.Object) it.get (), - node, - false, - i++ - ); + Yaml.Builder.to_node ((GLib.Object) it.get (), node, false, i++); + } + return node; + } + + /** + * build an object Gee.HashMap to a Yaml.Node + * @param map the gee hashmap to transform + * @param name name of map sequence node + * @param parent parent node of the map + * @return the resulting Yaml.Node + */ + public static Yaml.Node? objects_mapkstr_to_node (Gee.HashMap map, string name, Yaml.Node? parent = null) + { + var node = new Yaml.Sequence (parent, name); + node.tag = new Yaml.Tag (Yaml.Register.resolve_namespace_type(map.get_type ()), "v"); + var i = 0; + foreach (var child in map.entries) { + var entryNode = new Yaml.Mapping (node, "_%d".printf (i++)); + new Yaml.Mapping.with_scalar (entryNode, "key", (string) child.key); + Yaml.Builder.to_node ((GLib.Object) child.value, entryNode, false, null, "val"); + } + return node; + } + + + /** + * build an object Gee.HashMap to a Yaml.Node + * @param map the gee hashmap to transform + * @param name name of map sequence node + * @param parent parent node of the map + * @return the resulting Yaml.Node + */ + public static Yaml.Node? objects_mapobjects_to_node (Gee.HashMap map, string name, Yaml.Node? parent = null) + { + var node = new Yaml.Sequence (parent, name); + node.tag = new Yaml.Tag (Yaml.Register.resolve_namespace_type(map.get_type ()), "v"); + var i = 0; + foreach (var child in map.entries) { + var entryNode = new Yaml.Mapping (node, "_%d".printf (i++)); + Yaml.Builder.to_node ((GLib.Object) child.key, entryNode, false, null, "key"); + Yaml.Builder.to_node ((GLib.Object) child.value, entryNode, false, null, "val"); } return node; } diff --git a/src/vala/Pluie/Yaml.global.vala b/src/vala/Pluie/Yaml.global.vala index edef0d5..8ac3404 100644 --- a/src/vala/Pluie/Yaml.global.vala +++ b/src/vala/Pluie/Yaml.global.vala @@ -100,7 +100,9 @@ namespace Pluie.Yaml } /** - * + * serialize an object as a yaml compressed document data + * @param obj the object to serialize + * @param dest path destination if you want to write to a file */ public static uint8[] serialize (GLib.Object? obj, string? dest = null) { @@ -137,7 +139,8 @@ namespace Pluie.Yaml } /** - * + * deserialize yaml compressed document data to a Yaml.Object + * @param zdata the data to deserialized */ public static Yaml.Root deserialize (uint8[] zdata) { @@ -436,7 +439,7 @@ namespace Pluie.Yaml } /** - *@return universal infos related to NODE_TYPE + *@return a universal unique identifier (type 4) */ public string uuid () {