Commit | Line | Data |
381e8dad |
1 | package DX::Deparse; |
2 | |
c25fbf05 |
3 | use Scalar::Util qw(blessed); |
381e8dad |
4 | use DX::Class; |
5 | |
6 | sub indent_by { ' ' } |
7 | |
c25fbf05 |
8 | sub format { |
381e8dad |
9 | my ($self, $thing) = @_; |
c25fbf05 |
10 | local our $Indent_Level = 0; |
11 | $self->_format($thing); |
7f385fb2 |
12 | } |
13 | |
c25fbf05 |
14 | sub _format { |
15 | my ($self, $thing) = @_; |
16 | my ($as, $data) = @{blessed($thing) ? $thing->for_deparse : $thing}; |
17 | $self->${\"_format_as_${as}"}($data); |
381e8dad |
18 | } |
19 | |
c25fbf05 |
20 | sub _format_indented { |
21 | my ($self, $cb) = @_; |
22 | our $Indent_Level; |
23 | local $Indent_Level = $Indent_Level + 1; |
24 | my $unindented = $cb->(); |
25 | (my $indented = $unindented) =~ s/^/${\$self->indent_by}/mg; |
26 | return $indented; |
1e812b19 |
27 | } |
28 | |
c25fbf05 |
29 | sub _format_as_string { |
30 | my ($self, $val) = @_; |
1e812b19 |
31 | # TODO: multiline handling |
381e8dad |
32 | if ($val =~ /^\w+$/) { |
33 | qq{'${val}'} |
34 | } else { |
35 | qq{{'${val}'}} |
36 | } |
37 | } |
38 | |
c25fbf05 |
39 | sub _format_as_symbol { $_[1] } |
1e812b19 |
40 | |
c25fbf05 |
41 | sub _format_as_maybe_bareword { |
42 | my ($self, $maybe_bareword) = @_; |
43 | # should stringify if required |
44 | return $maybe_bareword; |
39351e10 |
45 | } |
46 | |
c25fbf05 |
47 | sub _format_as_number { $_[1] } |
1e812b19 |
48 | |
c25fbf05 |
49 | sub _format_as_boolean { $_[1] ? 'true' : 'false' } |
1e812b19 |
50 | |
c25fbf05 |
51 | sub _format_as_unset { 'unset' } |
e442aff8 |
52 | |
c25fbf05 |
53 | sub _format_as_array { |
54 | my ($self, $members) = @_; |
55 | join ' ', '{[', (map $self->_format($_), @$members), ']}'; |
1e812b19 |
56 | } |
57 | |
c25fbf05 |
58 | sub _format_as_dict { |
59 | my ($self, $members) = @_; |
60 | join ' ', '{{', ( |
61 | map +( |
62 | $self->_format_as_maybe_bareword($_), |
63 | $self->_format($members->{$_}), |
64 | ), sort keys %$members |
65 | ), '}}'; |
693f2d6d |
66 | } |
67 | |
c25fbf05 |
68 | sub _format_as_statement { |
69 | my ($self, $parts) = @_; |
70 | join ' ', map $self->_format($_), @$parts; |
061f9d55 |
71 | } |
72 | |
c25fbf05 |
73 | sub _format_as_value_path { |
74 | my ($self, $parts) = @_; |
75 | join '.', map $self->_format_as_maybe_bareword($_), @$parts; |
693f2d6d |
76 | } |
1e812b19 |
77 | |
c25fbf05 |
78 | sub _format_as_list { |
79 | my ($self, $members) = @_; |
80 | join "\n", '{', ( |
81 | map $self->_format_indented($self->curry::_format($_)), @$members |
82 | ), '}'; |
1e812b19 |
83 | } |
84 | |
c25fbf05 |
85 | sub _format_as_pairs { |
86 | my ($self, $members) = @_; |
87 | join "\n", '{', ( |
88 | map $self->_format_indented(sub { |
89 | $self->_format_as_maybe_bareword($_->[0]) |
90 | .' '.$self->_format($_->[1]) |
91 | }), @$members |
92 | ), '}'; |
1e812b19 |
93 | } |
381e8dad |
94 | |
c25fbf05 |
95 | sub _format_as_block { |
96 | my ($self, $members) = @_; |
97 | join "\n", '{', ( |
98 | map $self->_format_indented($self->curry::_format($_)), @$members |
99 | ), '}'; |
56f90161 |
100 | } |
101 | |
381e8dad |
102 | 1; |