value_path will work fine for new-value binding, identity_path not required
[scpubgit/DX.git] / lib / DX / Predicate / MemberAt.pm
CommitLineData
9d759b64 1package DX::Predicate::MemberAt;
2
4aeeab1e 3use DX::Utils qw(step INDICES_OF EXISTENCE_OF CONTENTS_OF string);
dcf2adc7 4use DX::ActionBuilder::ProxySetToAdd;
c35c4f36 5use DX::ActionBuilder::Null;
9d759b64 6use DX::Class;
7
8with 'DX::Role::Predicate';
9
9d759b64 10sub _possible_resolution_list {
11 my ($self, $coll, $key, $value) = @_;
12 die "First argument to member_at must be a structured value"
13 unless $coll->does('DX::Role::StructuredValue');
14 return (
15 ($key->is_set
16 ? map $_->but_with_dependencies_on(
0498469a 17 [ undef ,=>
18 [ EXISTENCE_OF ,=> $coll, $key->string_value ],
19 [ CONTENTS_OF ,=> $key ],
20 ]
9d759b64 21 ), do {
22 if (my $cur_val = $coll->get_member_at($key)) {
23 $self->_make_equal($cur_val, $value);
24 } elsif (
25 $value->is_set
0498469a 26 and my $add = $coll->action_for_add_member($key, $value)
9d759b64 27 ) {
28 step(
29 actions => [ $add ],
30 depends_on => [
0498469a 31 [ $value =>
32 [ CONTENTS_OF ,=> $coll, $key->string_value ],
33 [ CONTENTS_OF ,=> $value ],
34 ],
9d759b64 35 ],
36 );
dcf2adc7 37 } elsif (
38 !$value->is_set
39 and $value->action_builder->isa('DX::ActionBuilder::UnsetValue')
cd830321 40 and my $p = $coll->value_path
dcf2adc7 41 ) {
42 my @path = (@$p, $key->string_value);
43 my $ab = DX::ActionBuilder::ProxySetToAdd->new(
44 target_path => \@path,
45 proxy_to => $coll->action_builder,
46 );
47 my $set = $value->action_for_set_value(
48 $value->but(
dcf2adc7 49 action_builder => $ab
50 )
51 );
52 step(
53 actions => [ $set ],
54 depends_on => [
55 [ $value =>
56 [ CONTENTS_OF ,=> $coll, $key->string_value ],
57 [ CONTENTS_OF ,=> $value ],
58 ],
59 ],
60 );
9d759b64 61 } else {
62 ()
63 }
64 }
65 : ()
66 ),
c35c4f36 67 (!$key->is_set
68 && $key->action_builder->isa('DX::ActionBuilder::UnsetValue')
9d759b64 69 ? map {
c35c4f36 70 my $set_key = DX::Action::SetValue->new(
71 target_path => $key->action_builder->target_path,
72 new_value => DX::ActionBuilder::Null->new(
73 target_path => $key->action_builder->target_path,
74 )->apply_to_value(string(my $kstr = $_))
75 );
9d759b64 76 map $_->but_first($set_key)
77 ->but_with_dependencies_on(
0498469a 78 [ undef ,=>
be5871c6 79 [ EXISTENCE_OF ,=> $coll, $kstr ],
80 [ CONTENTS_OF ,=> $key ],
0498469a 81 ]
9d759b64 82 ),
83 $self->_make_equal($coll->get_member_at($_), $value);
84 } $coll->index_list
85 : ()
86 ),
87 );
88}
89
90sub selection_depends_on {
91 my ($self, $coll, $key, $value) = @_;
0498469a 92 die "NEEDS REDOING";
efad53c4 93 [ [ $coll => ($key->can_set_value ? INDICES_OF : (EXISTENCE_OF ,=> $key)) ],
9d759b64 94 $key,
95 $value,
96 ]
97}
98
991;