Skip to content

Commit

Permalink
by- prefix for vars, should support arrays better
Browse files Browse the repository at this point in the history
  • Loading branch information
Tony O'Dell committed May 12, 2017
1 parent 257efe7 commit bc79126
Show file tree
Hide file tree
Showing 6 changed files with 67 additions and 20 deletions.
8 changes: 4 additions & 4 deletions README.md
Expand Up @@ -28,16 +28,16 @@ Calling `parse` with the following JSON will run through and choose what it thin
},
"options": {
"run": {
"distro.name": {
"by-distro.name": {
"macosx": {
"distro.version": {
"by-distro.version": {
"10.0+": "10make",
"9.0+": "9make",
"8.0+": "8make"
}
},
"win32": {
"distro.version": {
"by-distro.version": {
"6+": "6winmake",
"5+": "5winmake"
}
Expand All @@ -49,7 +49,7 @@ Calling `parse` with the following JSON will run through and choose what it thin
"default-test": {
"second-test": "string-val, no decisions",
"first-test": {
"distro.name": {
"by-distro.name": {
"": "default-option1"
}
}
Expand Down
44 changes: 33 additions & 11 deletions lib/System/Query.pm6
Expand Up @@ -13,36 +13,58 @@ sub merge-tree(@ptr, Bool :$copy = False) {
if @ptr.elems > 1;
$vkey //= '';
if $copy || (@ptr.elems == 2 && @ptr[*-1].keys.elems > 0 && @ptr[*-1]{@ptr[*-1].keys[0]}.defined) {
$vkey = @ptr[*-1].keys[0];
@ptr[*-2]{$vkey} = @ptr[*-1]{$vkey};
if @ptr[*-1] ~~ Str {
@ptr[*-2] = @ptr[*-1];
} else {
$vkey = @ptr[*-1].keys[0];
@ptr[*-2]{$vkey} = @ptr[*-1]{$vkey};
}
} else {
@ptr[*-1].keys.map({
@ptr[*-2]{@ptr[*-2].keys[0]}{$_} = @ptr[*-1]{$_}
unless $copy;
}) if @ptr.elems > 1 && @ptr[*-2].keys.elems == 1 && @ptr[*-2]{"$vkey"}.defined && @ptr[*-1] ~~ Hash &&
!$copy;
@ptr[*-2]{@ptr[*-2].keys[0]} = @ptr[*-1]
if @ptr.elems > 1 && @ptr[*-2].keys.elems == 1 && !@ptr[*-2]{"$vkey"}.defined;
@ptr[*-2]{@ptr[*-2].keys[0]} = @ptr[*-1]
if @ptr.elems > 1 && @ptr[*-2].keys.elems == 1 && !@ptr[*-2]{"$vkey"}.defined;
}
@ptr.pop if @ptr.elems > 1;
}

sub data-resolve($world) {
if $world ~~ Array {
my @action;
for @($world) -> $data {
if $data ~~ Hash {
my $new-item = system-collapse(%($data));
@action.push( $new-item );
next;
}
@action.push($data);
}
return @action;
}
$world;
}

sub system-collapse(%data, %tree?, @ptr?) is export {
my ($PTR, @path, @versions, $key);
my $MAIN = !@ptr.elems;
my $c = %data.keys.elems;
@ptr.push(%tree)
unless @ptr.elems;
for %data.keys -> $k {
$c--;
merge-tree(@ptr, :copy)
if @ptr.elems > 1 && $MAIN;
given $k {
when /^'kernel'/ {
when /^'by-kernel'/ {
$PTR = $*KERNEL;
}
when /^'distro'/ {
when /^'by-distro'/ {
$PTR = $*DISTRO;
}
when /^'backend'/ {
when /^'by-backend'/ {
$PTR = $*BACKEND;
}
default {
Expand All @@ -56,9 +78,9 @@ sub system-collapse(%data, %tree?, @ptr?) is export {
if %data{$k} ~~ Hash {
system-collapse(%data{$k}, %tree, @ptr);
} else{
@ptr.push( %data{$k} );
@ptr.push( data-resolve(%data{$k}) );
}
merge-tree(@ptr);
merge-tree(@ptr, :copy($c == 0 && $MAIN && @ptr.elems <= 2));
next;
}
@path = $k.split('.');
Expand Down Expand Up @@ -100,8 +122,8 @@ sub system-collapse(%data, %tree?, @ptr?) is export {
@ptr.push( %data{$k}{$tree} )
unless %data{$k}{$tree} ~~ Hash;
}
merge-tree(@ptr);
return;
merge-tree(@ptr, :copy($c == 0 && $MAIN));
return @ptr[0];
}
}
merge-tree(@ptr, :copy)
Expand Down
16 changes: 16 additions & 0 deletions t/array.t
@@ -0,0 +1,16 @@
#!/usr/bin/env perl6

use JSON::Fast;
use Test;
use lib 'lib';
use System::Query;
use Data::Dump;

plan 4;
my $json-str = 't/data/array.json'.IO.slurp;
my $options = system-collapse( from-json( $json-str ) );

ok $options<options>.elems == 3;
ok $options<options>[0]<value> eq 'option one';
ok $options<options>[1] eq 'option two';
ok $options<options>[2] eq 'option three';
9 changes: 9 additions & 0 deletions t/data/array.json
@@ -0,0 +1,9 @@
{
"options": [{
"value": {
"by-distro.name": {
"": "option one"
}
}
}, { "by-distro.name": { "": "option two" } }, "option three"]
}
2 changes: 1 addition & 1 deletion t/data/die.json
@@ -1,6 +1,6 @@
{
"options": {
"distro.name": {
"by-distro.name": {
"idontexit": "test"
}
}
Expand Down
8 changes: 4 additions & 4 deletions t/data/one.json
Expand Up @@ -7,16 +7,16 @@
},
"options": {
"run": {
"distro.name": {
"by-distro.name": {
"macosx": {
"distro.version": {
"by-distro.version": {
"10.0+": "10make",
"9.0+": "9make",
"8.0+": "8make"
}
},
"win32": {
"distro.version": {
"by-distro.version": {
"6+": "6winmake",
"5+": "5winmake"
}
Expand All @@ -28,7 +28,7 @@
"default-test": {
"second-test": "string-val, no decisions",
"first-test": {
"distro.name": {
"by-distro.name": {
"": "default-option1"
}
}
Expand Down

0 comments on commit bc79126

Please sign in to comment.