diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2017-12-03 14:14:21 +0100 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2017-12-03 14:14:21 +0100 |
commit | 9f89acb180d22d30bb4ffed659969d57cf5cabce (patch) | |
tree | 9dfe0b30b92cccd45b28158f4442c242dd988968 /lib/Config/Tree.pm | |
parent | ceb4bd03d48d161548e00f1db170b376583894a8 (diff) | |
download | config-ast-9f89acb180d22d30bb4ffed659969d57cf5cabce.tar.gz config-ast-9f89acb180d22d30bb4ffed659969d57cf5cabce.tar.bz2 |
Implement add_node and add_value methods
Diffstat (limited to 'lib/Config/Tree.pm')
-rw-r--r-- | lib/Config/Tree.pm | 43 |
1 files changed, 30 insertions, 13 deletions
diff --git a/lib/Config/Tree.pm b/lib/Config/Tree.pm index 39e0de9..f22d8e5 100644 --- a/lib/Config/Tree.pm +++ b/lib/Config/Tree.pm | |||
@@ -507,20 +507,21 @@ sub _get_section_synt { | |||
507 | =cut | 507 | =cut |
508 | 508 | ||
509 | sub add_node { | 509 | sub add_node { |
510 | my ($self, $path, $v, $locus) = @_; | 510 | my ($self, $path, $node) = @_; |
511 | 511 | ||
512 | unless (ref($path) eq 'ARRAY') { | 512 | unless (ref($path) eq 'ARRAY') { |
513 | $path = [ split(/\./, $path) ] | 513 | $path = [ split(/\./, $path) ] |
514 | } | 514 | } |
515 | 515 | ||
516 | my $kw = $self->{_parameters} // { '*' => '*' }; | 516 | my $kw = $self->{_parameters} // { '*' => '*' }; |
517 | my $node = $self->tree; | 517 | my $tree = $self->tree; |
518 | my $pn = $#{$path}; | 518 | my $pn = $#{$path}; |
519 | my $name; | 519 | my $name; |
520 | my $locus = $node->locus; | ||
520 | for (my $i = 0; $i < $pn; $i++) { | 521 | for (my $i = 0; $i < $pn; $i++) { |
521 | $name = ${$path}[$i]; | 522 | $name = ${$path}[$i]; |
522 | 523 | ||
523 | unless ($node->is_section) { | 524 | unless ($tree->is_section) { |
524 | $self->error(join('.', @{$path}[0..$i]) . ": not a section"); | 525 | $self->error(join('.', @{$path}[0..$i]) . ": not a section"); |
525 | $self->{_error_count}++; | 526 | $self->{_error_count}++; |
526 | return; | 527 | return; |
@@ -533,10 +534,10 @@ sub add_node { | |||
533 | return; | 534 | return; |
534 | } | 535 | } |
535 | 536 | ||
536 | if (my $subtree = $node->subtree($name)) { | 537 | if (my $subtree = $tree->subtree($name)) { |
537 | $node = $subtree; | 538 | $tree = $subtree; |
538 | } else { | 539 | } else { |
539 | $node = $node->subtree( | 540 | $tree = $tree->subtree( |
540 | $name => new Config::Tree::Node::Section( | 541 | $name => new Config::Tree::Node::Section( |
541 | order => $self->{_order}++, | 542 | order => $self->{_order}++, |
542 | locus => $locus->clone) | 543 | locus => $locus->clone) |
@@ -553,12 +554,24 @@ sub add_node { | |||
553 | return; | 554 | return; |
554 | } | 555 | } |
555 | 556 | ||
557 | if ($node->is_section) { | ||
558 | if ($tree->has_key($name)) { | ||
559 | $tree->locus->add($locus); | ||
560 | $tree->subtree($name)->merge($node); | ||
561 | } else { | ||
562 | $tree->subtree($name => $node); | ||
563 | } | ||
564 | return $node; | ||
565 | } | ||
566 | |||
567 | my $v = $node->value; | ||
568 | |||
556 | if (ref($x) eq 'HASH') { | 569 | if (ref($x) eq 'HASH') { |
557 | my $errstr; | 570 | my $errstr; |
558 | my $prev_val; | 571 | my $prev_val; |
559 | if ($node->has_key($name)) { | 572 | if ($tree->has_key($name)) { |
560 | # FIXME: is_value? | 573 | # FIXME: is_value? |
561 | $prev_val = $node->subtree($name)->value; | 574 | $prev_val = $tree->subtree($name)->value; |
562 | } | 575 | } |
563 | if (exists($x->{re})) { | 576 | if (exists($x->{re})) { |
564 | if ($v !~ /$x->{re}/) { | 577 | if ($v !~ /$x->{re}/) { |
@@ -585,21 +598,25 @@ sub add_node { | |||
585 | } | 598 | } |
586 | } | 599 | } |
587 | 600 | ||
588 | $node->locus->add($locus->clone); | 601 | $tree->locus->add($locus->clone); |
589 | 602 | ||
590 | my $newnode; | 603 | my $newnode; |
591 | if ($newnode = $node->subtree($name)) { | 604 | if ($newnode = $tree->subtree($name)) { |
592 | $newnode->locus->add($locus); | 605 | $newnode->locus->add($locus); |
593 | } else { | 606 | } else { |
594 | $newnode = $node->subtree( | 607 | $newnode = $tree->subtree($name => $node); |
595 | $name => new Config::Tree::Node::Value(locus => $locus) | ||
596 | ); | ||
597 | } | 608 | } |
598 | $newnode->order($self->{order}++); | 609 | $newnode->order($self->{order}++); |
599 | $newnode->value($v); | 610 | $newnode->value($v); |
600 | return $newnode; | 611 | return $newnode; |
601 | } | 612 | } |
602 | 613 | ||
614 | sub add_value { | ||
615 | my ($self, $path, $value, $locus) = @_; | ||
616 | $self->add_node($path, new Config::Tree::Node::Value(value => $value, | ||
617 | locus => $locus)); | ||
618 | } | ||
619 | |||
603 | sub commit { | 620 | sub commit { |
604 | my ($self) = @_; | 621 | my ($self) = @_; |
605 | # FIXME | 622 | # FIXME |