suite tag impl
This commit is contained in:
parent
e98c7c070f
commit
7bb36efe51
|
@ -250,6 +250,6 @@ see samples files in ./samples directory
|
|||
* ~~rewrite nodes classes~~
|
||||
* ~~put doc online~~
|
||||
* ~~add docker image~~
|
||||
* manage tag directives & tag
|
||||
* improve doc
|
||||
* dumper
|
||||
* manage tag directives & tag
|
||||
|
|
|
@ -60,26 +60,28 @@ sources = [
|
|||
'build/install.vala',
|
||||
'src/vala/Pluie/Io.Reader.vala',
|
||||
'src/vala/Pluie/Io.StreamLineMark.vala',
|
||||
'src/vala/Pluie/Db.Profile.vala',
|
||||
'src/vala/Pluie/Yaml.global.vala',
|
||||
'src/vala/Pluie/Yaml.AbstractChild.vala',
|
||||
'src/vala/Pluie/Yaml.AbstractNode.vala',
|
||||
'src/vala/Pluie/Yaml.Collection.vala',
|
||||
'src/vala/Pluie/Yaml.Config.vala',
|
||||
'src/vala/Pluie/Yaml.Event.vala',
|
||||
'src/vala/Pluie/Yaml.Example.vala',
|
||||
'src/vala/Pluie/Yaml.Finder.vala',
|
||||
'src/vala/Pluie/Yaml.Loader.vala',
|
||||
'src/vala/Pluie/Yaml.Mapping.vala',
|
||||
'src/vala/Pluie/Yaml.Node.vala',
|
||||
'src/vala/Pluie/Yaml.Object.vala',
|
||||
'src/vala/Pluie/Yaml.Processor.vala',
|
||||
'src/vala/Pluie/Yaml.Scalar.vala',
|
||||
'src/vala/Pluie/Yaml.Scanner.vala',
|
||||
'src/vala/Pluie/Yaml.Sequence.vala',
|
||||
'src/vala/Pluie/Yaml.Processor.vala',
|
||||
'src/vala/Pluie/Yaml.Tag.vala',
|
||||
'src/c/yaml.c'
|
||||
]
|
||||
|
||||
install_data('resources/main.yml', install_dir : datadir)
|
||||
install_data('resources/tag.yml', install_dir : datadir)
|
||||
install_data('resources/test.yml', install_dir : datadir)
|
||||
install_data('resources/test.json', install_dir : datadir)
|
||||
install_data('resources/config/db.yml', install_dir : join_paths(datadir, 'config'))
|
||||
|
|
|
@ -14,4 +14,4 @@ therapy :
|
|||
user : dev
|
||||
password : mysql
|
||||
charset : utf8
|
||||
port : !!int 3306
|
||||
port : 3306
|
||||
|
|
15
resources/tag.yml
Normal file
15
resources/tag.yml
Normal file
|
@ -0,0 +1,15 @@
|
|||
%YAML 1.2
|
||||
%TAG !yaml! tag:yaml.org,2002:
|
||||
%TAG !vala! tag:pluie.org,2018:vala/
|
||||
---
|
||||
!vala!Pluie.Yaml.Example test1 :
|
||||
|
||||
type_int : !vala!int 3306
|
||||
type_bool : !vala!bool false
|
||||
type_char : !vala!char c
|
||||
|
||||
!vala!Pluie.Yaml.Example test2 :
|
||||
|
||||
type_int : !vala!int 3306
|
||||
type_bool : !vala!bool true
|
||||
type_char : !vala!char g
|
|
@ -35,43 +35,33 @@ int main (string[] args)
|
|||
{
|
||||
Echo.init(false);
|
||||
|
||||
var path = Yaml.DATA_PATH + "/config/db.yml";
|
||||
var path = Yaml.DATA_PATH + "/tag.yml";
|
||||
var done = false;
|
||||
|
||||
of.title ("Pluie Yaml Library", Pluie.Yaml.VERSION, "a-sansara");
|
||||
Pluie.Yaml.Scanner.DEBUG = false;
|
||||
Pluie.Yaml.Scanner.DEBUG = true;
|
||||
var config = new Yaml.Config (path, true);
|
||||
Yaml.Node root = (Yaml.Node) config.root_node ();
|
||||
Gee.HashMap<string, Db.Profile> db = new Gee.HashMap<string, Db.Profile> ();
|
||||
root.display_childs ();
|
||||
Gee.HashMap<string, Yaml.Example> list = new Gee.HashMap<string, Yaml.Example> ();
|
||||
if ((done = root != null)) {
|
||||
foreach (var node in root) {
|
||||
of.action ("Yamlize DB profile", node.name);
|
||||
db[node.name] = new Db.Profile ();
|
||||
if (db[node.name].yamlize (node)) {
|
||||
foreach (var p in db[node.name].get_class().list_properties ()) {
|
||||
var g = (node as Yaml.Mapping).item (p.name);
|
||||
if (g.tag == null) {
|
||||
var v = null;
|
||||
db[node.name].get(p.name, &v);
|
||||
of.keyval (p.name, v != null ? v : "null");
|
||||
}
|
||||
else {
|
||||
//~ of.echo ("tag is %s".printf (g.tag));
|
||||
if (g.tag == "int") {
|
||||
int z = -1;
|
||||
db[node.name].get(p.name, ref z);
|
||||
of.keyval (p.name, z.to_string ());
|
||||
}
|
||||
}
|
||||
}
|
||||
of.action ("Yamlize Yaml.Example", node.name);
|
||||
of.echo (node.to_string ());
|
||||
if (node.tag != null && node.tag.@value == "Pluie.Yaml.Example") {
|
||||
list[node.name] = new Yaml.Example ();
|
||||
of.state (list[node.name].yamlize (node));
|
||||
}
|
||||
node = node.next_sibling ();
|
||||
}
|
||||
}
|
||||
|
||||
of.echo ("param [%s] port as int %d".printf ("bo", db["bo"].port));
|
||||
of.echo ("param [%s] port as int %d".printf ("therapy", db["therapy"].port));
|
||||
|
||||
foreach (var entry in list.entries) {
|
||||
of.action ("Getting values", entry.key);
|
||||
of.keyval("type_int" , "%d".printf(entry.value.type_int));
|
||||
of.keyval("type_bool", "%s".printf(entry.value.type_bool.to_string ()));
|
||||
of.keyval("type_char", "%c".printf(entry.value.type_char));
|
||||
}
|
||||
|
||||
of.rs (done);
|
||||
of.echo ();
|
||||
|
|
|
@ -100,6 +100,11 @@ void yaml_parse_file(const char *srcPath, const char *destPath)
|
|||
fprintf(wh, "%lu, %d, %d, %d\n", line, token.type, token.data.version_directive.major, token.data.version_directive.minor);
|
||||
break;
|
||||
|
||||
case YAML_TAG_DIRECTIVE_TOKEN :
|
||||
printf ("YAML_TAG_DIRECTIVE_TOKEN : handle : %s, prefix : %s\n", token.data.tag_directive.handle, token.data.tag_directive.prefix);
|
||||
fprintf(wh, "%lu, %d, \"%s\", \"%s\"\n", line, token.type, token.data.tag_directive.handle, token.data.tag_directive.prefix);
|
||||
break;
|
||||
|
||||
case YAML_NO_TOKEN :
|
||||
fprintf(wh, "%lu, %d, \"%s\"\n", line, token.type, escape_string((char *)parser.problem));
|
||||
stop = 1;
|
||||
|
|
|
@ -54,7 +54,7 @@ public abstract class Pluie.Yaml.AbstractChild : Yaml.AbstractNode
|
|||
/**
|
||||
*
|
||||
*/
|
||||
public string? tag { get; internal set; default = null; }
|
||||
public Yaml.Tag? tag { get; internal set; default = null; }
|
||||
|
||||
/**
|
||||
* default Yaml.Node constructor
|
||||
|
|
60
src/vala/Pluie/Yaml.Example.vala
Normal file
60
src/vala/Pluie/Yaml.Example.vala
Normal file
|
@ -0,0 +1,60 @@
|
|||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
*
|
||||
* @software : lib-yaml <https://git.pluie.org/pluie/lib-yaml>
|
||||
* @version : 0.4
|
||||
* @date : 2018
|
||||
* @licence : GPLv3.0 <http://www.gnu.org/licenses/>
|
||||
* @author : a-Sansara <[dev]at[pluie]dot[org]>
|
||||
* @copyright : pluie.org <http://www.pluie.org/>
|
||||
*
|
||||
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
*
|
||||
* This file is part of lib-yaml.
|
||||
*
|
||||
* lib-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.
|
||||
*
|
||||
* lib-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 lib-yaml. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
*/
|
||||
|
||||
/**
|
||||
* a test class to implements yamlize
|
||||
|
||||
*/
|
||||
public class Pluie.Yaml.Example : Yaml.Object
|
||||
{
|
||||
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; }
|
||||
|
||||
}
|
|
@ -40,7 +40,7 @@ public class Pluie.Yaml.Node : Yaml.AbstractChild, Pluie.Yaml.Collection
|
|||
*/
|
||||
public ArrayList<Yaml.Node> list { get; internal set; }
|
||||
|
||||
bool container { get; internal set; default = true; }
|
||||
bool container { get; internal set; default = true; }
|
||||
|
||||
/**
|
||||
* default Yaml.Node constructor
|
||||
|
@ -294,7 +294,7 @@ public class Pluie.Yaml.Node : Yaml.AbstractChild, Pluie.Yaml.Collection
|
|||
)),
|
||||
withCount ? of.c (ECHO.MICROTIME).s (" %d".printf(this.count ())) : "",
|
||||
withUuid ? of.c (ECHO.COMMENT).s (" %s".printf(this.uuid[0:8]+"...")) : "",
|
||||
this.tag != null ? of.c (ECHO.OPTION_SEP).s (" %s".printf(this.tag)) : "",
|
||||
this.tag != null ? of.c (ECHO.OPTION_SEP).s (" %s".printf(this.tag.@value)) : "",
|
||||
//~ of.c (ECHO.NUM).s ("%d".printf (this.level)),
|
||||
of.c (ECHO.OPTION).s ("]")
|
||||
);
|
||||
|
|
|
@ -45,19 +45,27 @@ public abstract class Pluie.Yaml.Object : GLib.Object
|
|||
if (node!= null && !node.empty ()) {
|
||||
Iterator<Yaml.Node> it = node.iterator ();
|
||||
foreach (var child in node) {
|
||||
foreach (var p in this.get_class ().list_properties ()) {
|
||||
if (p.name == child.name) {
|
||||
if (child.tag != null) {
|
||||
switch (child.tag) {
|
||||
case "int" :
|
||||
this.set (p.name, int.parse(child.first ().data));
|
||||
break;
|
||||
}
|
||||
}
|
||||
else {
|
||||
this.set (p.name, child.first ().data);
|
||||
of.action ("yamlize ", child.to_string ());
|
||||
var pspec = this.get_class ().find_property (child.name);
|
||||
if (pspec != null) {
|
||||
if (child.first ().tag != null) {
|
||||
of.keyval ("found tag", child.first ().tag.@value);
|
||||
//~ of.keyval ("value is `%s`", child.first ().data);
|
||||
switch (child.first ().tag.@value) {
|
||||
case "char" :
|
||||
this.set (child.name, child.first ().data[0]);
|
||||
break;
|
||||
case "bool" :
|
||||
this.set (child.name, bool.parse(child.first ().data.down ()));
|
||||
break;
|
||||
case "int" :
|
||||
this.set (child.name, int.parse(child.first ().data));
|
||||
break;
|
||||
}
|
||||
}
|
||||
else {
|
||||
this.set (child.name, child.first ().data);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -62,9 +62,14 @@ public class Pluie.Yaml.Processor
|
|||
string? ckey;
|
||||
|
||||
/**
|
||||
* current tag suffix
|
||||
* current key tag
|
||||
*/
|
||||
string? tagSuffix;
|
||||
Yaml.Tag? keyTag;
|
||||
|
||||
/**
|
||||
* current key tag
|
||||
*/
|
||||
Yaml.Tag? valueTag;
|
||||
|
||||
/**
|
||||
* current tag handle
|
||||
|
@ -81,6 +86,11 @@ public class Pluie.Yaml.Processor
|
|||
*/
|
||||
Gee.HashMap<string, Yaml.Node> anchors { get; internal set; }
|
||||
|
||||
/**
|
||||
* Tags map definition
|
||||
*/
|
||||
Gee.HashMap<string, string> tags { get; internal set; }
|
||||
|
||||
/**
|
||||
* Error event
|
||||
*/
|
||||
|
@ -123,6 +133,7 @@ public class Pluie.Yaml.Processor
|
|||
{
|
||||
this.events = new Gee.ArrayList<Yaml.Event>();
|
||||
this.anchors = new Gee.HashMap<string, Yaml.Node>();
|
||||
this.tags = new Gee.HashMap<string, string>();
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -160,6 +171,9 @@ public class Pluie.Yaml.Processor
|
|||
this.reset ();
|
||||
for (var has_next = this.iterator.next (); has_next; has_next = this.iterator.next ()) {
|
||||
this.event = this.iterator.get ();
|
||||
if (this.event.evtype.is_tag_directive ()) {
|
||||
this.on_tag_directive ();
|
||||
}
|
||||
if (this.event.evtype.is_error ()) {
|
||||
this.on_error ();
|
||||
break;
|
||||
|
@ -209,7 +223,8 @@ public class Pluie.Yaml.Processor
|
|||
this.ckey = null;
|
||||
this.idAnchor = null;
|
||||
this.tagHandle = null;
|
||||
this.tagSuffix = null;
|
||||
this.keyTag = null;
|
||||
this.valueTag = null;
|
||||
this.beginFlowSeq = false;
|
||||
}
|
||||
|
||||
|
@ -251,6 +266,15 @@ public class Pluie.Yaml.Processor
|
|||
return evt;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
private void on_tag_directive ()
|
||||
{
|
||||
of.action ("on_tag_directive %s".printf (this.event.data["handle"]), this.event.data["prefix"]);
|
||||
this.tags[this.event.data["handle"]] = this.event.data["prefix"];
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
|
@ -284,11 +308,34 @@ public class Pluie.Yaml.Processor
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
private void on_tag (bool onKey = false)
|
||||
{
|
||||
if (this.event.evtype.is_tag ()) {
|
||||
of.keyval ("tag %s".printf (this.event.data["handle"]), this.event.data["suffix"]);
|
||||
if (this.tags.contains (this.event.data["handle"])) {
|
||||
var tag = new Yaml.Tag (this.event.data["suffix"], this.tags[this.event.data["handle"]]);
|
||||
if (onKey)
|
||||
this.keyTag = tag;
|
||||
else
|
||||
this.valueTag = tag;
|
||||
this.event = this.next_event ();
|
||||
}
|
||||
else {
|
||||
of.warn ("tag handle %s not found in directive".printf (this.event.data["handle"]));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
private void on_key ()
|
||||
{
|
||||
this.on_tag (true);
|
||||
this.ckey = this.event.data["data"];
|
||||
}
|
||||
|
||||
|
@ -297,12 +344,7 @@ public class Pluie.Yaml.Processor
|
|||
*/
|
||||
private void on_value ()
|
||||
{
|
||||
if (this.event.evtype.is_tag ()) {
|
||||
of.keyval ("tag", this.event.evtype.to_string ());
|
||||
this.tagSuffix = this.event.data["suffix"];
|
||||
this.tagHandle = this.event.data["handle"];
|
||||
this.event = this.next_event ();
|
||||
}
|
||||
this.on_tag (false);
|
||||
if (this.event.evtype.is_scalar ()) {
|
||||
this.on_scalar ();
|
||||
}
|
||||
|
@ -406,11 +448,22 @@ public class Pluie.Yaml.Processor
|
|||
*/
|
||||
private void on_update ()
|
||||
{
|
||||
if (this.node != null) {
|
||||
of.echo (this.node.name);
|
||||
}
|
||||
if (this.change) {
|
||||
if (this.tagSuffix != null) {
|
||||
of.action ("setting tag");
|
||||
this.node.tag = this.tagSuffix;
|
||||
of.echo (this.node.to_string ());
|
||||
of.action ("on change", this.node.name);
|
||||
if (this.keyTag != null) {
|
||||
of.action ("setting tag", this.keyTag.@value);
|
||||
this.node.tag = this.keyTag;
|
||||
}
|
||||
else if (this.valueTag != null) {
|
||||
if (this.node.ntype.is_scalar ()) {
|
||||
this.node.tag = this.valueTag;
|
||||
}
|
||||
else if (!this.node.empty () && this.node.first().ntype.is_scalar ()) {
|
||||
this.node.first ().tag = this.valueTag;
|
||||
}
|
||||
}
|
||||
if (this.node.ntype.is_collection () && (this.node.empty() || (!this.node.first().ntype.is_scalar ()))) {
|
||||
this.parent_node = this.node;
|
||||
|
@ -420,7 +473,8 @@ public class Pluie.Yaml.Processor
|
|||
}
|
||||
this.prev_node = this.node;
|
||||
this.tagHandle = null;
|
||||
this.tagSuffix = null;
|
||||
this.keyTag = null;
|
||||
this.valueTag = null;
|
||||
this.node = null;
|
||||
this.change = false;
|
||||
}
|
||||
|
|
|
@ -187,6 +187,25 @@ public class Pluie.Yaml.Scanner
|
|||
this.processor.events.add(new Yaml.Event(EVT.VERSION_DIRECTIVE, line, null, data));
|
||||
}
|
||||
|
||||
/**
|
||||
* register event tag
|
||||
* @param evtdata the current data event
|
||||
* @param line the current line
|
||||
* @throws GLib.RegexError
|
||||
*/
|
||||
private void register_event_tag_directive(string evtdata, int line) throws GLib.RegexError
|
||||
{
|
||||
MatchInfo mi = null;
|
||||
Regex reg = new Regex (REG_TAG);
|
||||
HashMap<string, string>? data = null;
|
||||
if (reg.match (evtdata, 0, out mi)) {
|
||||
data = new HashMap<string, string>();
|
||||
data.set("handle", mi.fetch (MIEVT_TAG.HANDLE));
|
||||
data.set("prefix", mi.fetch (MIEVT_TAG.SUFFIX));
|
||||
}
|
||||
this.processor.events.add(new Yaml.Event(EVT.TAG_DIRECTIVE, line, null, data));
|
||||
}
|
||||
|
||||
/**
|
||||
* register event tag
|
||||
* @param evtdata the current data event
|
||||
|
@ -299,25 +318,28 @@ public class Pluie.Yaml.Scanner
|
|||
string evtdata = mi.fetch (MIEVT.DATA);
|
||||
switch(type) {
|
||||
case EVT.SCALAR :
|
||||
this.register_event_scalar(evtdata, line);
|
||||
this.register_event_scalar (evtdata, line);
|
||||
break;
|
||||
case EVT.ANCHOR :
|
||||
this.register_event_anchor(evtdata, line);
|
||||
this.register_event_anchor (evtdata, line);
|
||||
break;
|
||||
case EVT.ALIAS :
|
||||
this.register_event_alias(evtdata, line);
|
||||
this.register_event_alias (evtdata, line);
|
||||
break;
|
||||
case EVT.TAG :
|
||||
this.register_event_tag(evtdata, line);
|
||||
this.register_event_tag (evtdata, line);
|
||||
break;
|
||||
case EVT.TAG_DIRECTIVE :
|
||||
this.register_event_tag_directive (evtdata, line);
|
||||
break;
|
||||
case EVT.VERSION_DIRECTIVE :
|
||||
this.register_event_version(evtdata, line);
|
||||
this.register_event_version (evtdata, line);
|
||||
break;
|
||||
case EVT.NONE :
|
||||
this.register_event_error(evtdata, line);
|
||||
this.register_event_error (evtdata, line);
|
||||
break;
|
||||
default :
|
||||
this.processor.events.add(new Yaml.Event((Yaml.EVT)type, line, null, null));
|
||||
this.processor.events.add(new Yaml.Event ((Yaml.EVT) type, line, null, null));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -26,19 +26,21 @@
|
|||
*
|
||||
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
*/
|
||||
using GLib;
|
||||
using Gee;
|
||||
|
||||
/**
|
||||
* a test class to implements yamlize
|
||||
|
||||
*/
|
||||
public class Pluie.Db.Profile : Yaml.Object
|
||||
public class Pluie.Yaml.Tag : GLib.Object
|
||||
{
|
||||
public string driver { get; set; }
|
||||
public string host { get; set; }
|
||||
public string dbname { get; set; }
|
||||
public string user { get; set; }
|
||||
public string password { get; set; }
|
||||
public string charset { get; set; }
|
||||
public int port { get; set; }
|
||||
public string handle { get; internal set; }
|
||||
public string @value { get; internal set; }
|
||||
|
||||
public Tag (string @value, string handle = "")
|
||||
{
|
||||
this.@value = @value;
|
||||
this.handle = handle;
|
||||
}
|
||||
}
|
|
@ -132,6 +132,14 @@ namespace Pluie
|
|||
return this == EVT.TAG;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return event is tag
|
||||
*/
|
||||
public bool is_tag_directive ()
|
||||
{
|
||||
return this == EVT.TAG_DIRECTIVE;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return event is key
|
||||
*/
|
||||
|
|
Loading…
Reference in New Issue
Block a user