2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-02-01 01:09:47 +00:00

98_JsonMod.pm: #109413: property with deeplinks

git-svn-id: https://svn.fhem.de/fhem/trunk@21515 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
herrmannj 2020-03-25 19:40:53 +00:00
parent beb504b5a6
commit 144433fc91

View File

@ -277,13 +277,13 @@ sub JsonMod_DoReadings {
my sub jsonPathf {
# https://forum.fhem.de/index.php/topic,109413.msg1034685.html#msg1034685
no if $] >= 5.022, q|warnings|, qw( redundant missing );
no if $] >= 5.022, 'warnings', qw( redundant missing );
#eval 'no warnings qw( redundant missing )' if ($] >= 5.22);
my ($jsonPathExpression, $format) = @_;
$format //= '%s';
my $value = $path->get($jsonPathExpression)->getResultValue();
#$path->get($jsonPathExpression)->getResultNormVal();
$value = $value->[0] if (ref($value) eq 'ARRAY' and scalar(@{$value}) > 0);
$value = $value->[0] if (ref($value) eq 'ARRAY' and scalar(@{$value}));
if (defined($value)) {
return sprintf($format, $value);
} else {
@ -296,16 +296,6 @@ sub JsonMod_DoReadings {
return $path->get($jsonPathExpression)->getResultValue();
};
# depraced
my sub singleReading {
my ($reading, $value, $default) = @_;
$value = $value->[0] if (ref($value) eq 'ARRAY' and scalar(@{$value}) > 0);
$value //= $default;
$newReadings->{$reading} = $value;
$oldReadings->{$reading} = 1;
return;
};
my sub concat {
my @args = @_;
return sub {
@ -324,65 +314,105 @@ sub JsonMod_DoReadings {
};
};
# my sub propertyf {
# my ($p, $default, $format) = @_;
# $default //= '';
# $format //= '';
# return sub {
# my ($o) = @_;
# if (ref($o) eq 'CODE') {
# return $o->($p, $default);
# } elsif (ref($o) eq 'HASH') {
# my $result = $o->{$p} if (exists($o->{$p}));
# if (defined($result)) {
# if (ref($result) eq '') {
# return sprintf ($format, $result);
# } else {
# return $result;
# };
# } else {
# return $default;
# };
# } elsif (ref($o) eq 'ARRAY') {
# my $result = $o->[$p] if ((scalar @{$o}) > ($p + 0));
# if (defined($result)) {
# if (ref($result) eq '') {
# return sprintf ($format, $result);
# } else {
# return $result;
# };
# } else {
# return $default;
# };
# } elsif (ref($o) eq '') {
# return $o;
# } else {
# die('syntax');
# };
# };
# };
my sub propertyf {
my ($p, $default, $format) = @_;
my ($propertyPath, $default, $format) = @_;
$default //= '';
$format //= '';
$format //= '%s';
return sub {
my ($o) = @_;
if (ref($o) eq 'CODE') {
return $o->($p, $default);
} elsif (ref($o) eq 'HASH') {
my $result = $o->{$p} if (exists($o->{$p}));
if (defined($result)) {
if (ref($result) eq '') {
return sprintf ($format, $result);
$propertyPath = $propertyPath->($o) if (ref($propertyPath) eq 'CODE');
$default = $default->($o) if (ref($default) eq 'CODE');
$format = $format->($o) if (ref($format) eq 'CODE');
if (ref($o) eq 'HASH' or ref($o) eq 'ARRAY') {
my $presult = JsonMod::JSON::Path->new($o)->get($propertyPath)->getResultValue();
if (defined($presult)) {
if (ref($presult) eq 'ARRAY') {
if (scalar(@{$presult})) {
no if $] >= 5.022, 'warnings', qw( redundant missing );
return sprintf($format, $presult->[0]); # the first element if multiple. be gentle ;)
} else {
return $default;
};
} else {
return $result;
return $presult;
};
} else {
return $default;
};
} elsif (ref($o) eq 'ARRAY') {
my $result = $o->[$p] if ((scalar @{$o}) > ($p + 0));
if (defined($result)) {
if (ref($result) eq '') {
return sprintf ($format, $result);
} else {
return $result;
};
} else {
return $default;
};
} elsif (ref($o) eq '') {
return $o;
} else {
die('syntax');
};
} else {
no if $] >= 5.022, 'warnings', qw( redundant missing );
return sprintf($format, $o);
# die("something went wrong while processing the JsonMod property '$propertyPath'. pls report it");
};
};
};
my sub property {
my ($p, $default) = @_;
my ($propertyPath, $default) = @_;
$default //= '';
return sub {
my ($o) = @_;
if (ref($o) eq 'CODE') {
return $o->($p, $default);
} elsif (ref($o) eq 'HASH') {
return $o->{$p} if (exists($o->{$p}));
return $default;
} elsif (ref($o) eq 'ARRAY') {
return $o->[$p] if ((scalar @{$o}) > ($p + 0));
return $default;
} elsif (ref($o) eq '') {
return $o;
} else {
die('syntax');
};
$propertyPath = $propertyPath->($o) if (ref($propertyPath) eq 'CODE');
$default = $default->($o) if (ref($default) eq 'CODE');
if (ref($o) eq 'HASH' or ref($o) eq 'ARRAY') {
my $presult = JsonMod::JSON::Path->new($o)->get($propertyPath)->getResultValue();
if (defined($presult)) {
if (ref($presult) eq 'ARRAY') {
if (scalar(@{$presult})) {
return $presult->[0]; # the first hit if many. be gentle ;)
} else {
return $default;
};
} else {
return $presult;
};
};
} else {
return $o;
# die("something went wrong while processing the JsonMod property '$propertyPath'. pls report it");
};
};
};
my $_index = 0;
my sub index {
#my $index = 0;
@ -412,9 +442,11 @@ sub JsonMod_DoReadings {
# value (mostly jsonPath) / reading name / default if value is not available
my sub single {
my ($value, $reading, $default) = @_;
$value = $value->[0] if (ref($value) eq 'ARRAY' and scalar(@{$value}) > 0);
#use Data::Dumper;
#print $value;
$value = $value->() if (ref($value) eq 'CODE');
$reading = $reading->() if (ref($reading) eq 'CODE');
$default = $default->() if (ref($default) eq 'CODE');
$value = $value->[0] if (ref($value) eq 'ARRAY' and scalar(@{$value}));
$value //= $default;
$newReadings->{$reading} = $value;
$oldReadings->{$reading} = 1;
@ -560,7 +592,7 @@ sub JsonMod_Logger {
my ($hash, $verbose, $message, @args) = @_;
my $name = $hash->{'NAME'};
# https://forum.fhem.de/index.php/topic,109413.msg1034685.html#msg1034685
no if $] >= 5.022, q|warnings|, qw( redundant missing );
no if $] >= 5.022, 'warnings', qw( redundant missing );
#eval 'no warnings qw( redundant missing )' if ($] >= 5.22);
Log3 ($name, $verbose, sprintf('[%s] '.$message, $name, @args));
return;
@ -893,10 +925,13 @@ use strict;
use warnings;
use utf8;
use Text::Balanced qw ( extract_codeblock extract_delimited );
use Scalar::Util qw( blessed );
sub new {
my ($class, $o, $root) = @_;
# special case for JSON 'true' / 'false'
$o = "$o" if (blessed($o) and blessed($o) eq 'JSON::PP::Boolean');
my $t = ref($o);
if ($t eq 'HASH') {
return JsonMod::JSON::Path::HNode->new($o, $root);