rewrite deparse system
[scpubgit/DX.git] / lib / DX / Deparse.pm
CommitLineData
381e8dad 1package DX::Deparse;
2
c25fbf05 3use Scalar::Util qw(blessed);
381e8dad 4use DX::Class;
5
6sub indent_by { ' ' }
7
c25fbf05 8sub format {
381e8dad 9 my ($self, $thing) = @_;
c25fbf05 10 local our $Indent_Level = 0;
11 $self->_format($thing);
7f385fb2 12}
13
c25fbf05 14sub _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 20sub _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 29sub _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 39sub _format_as_symbol { $_[1] }
1e812b19 40
c25fbf05 41sub _format_as_maybe_bareword {
42 my ($self, $maybe_bareword) = @_;
43 # should stringify if required
44 return $maybe_bareword;
39351e10 45}
46
c25fbf05 47sub _format_as_number { $_[1] }
1e812b19 48
c25fbf05 49sub _format_as_boolean { $_[1] ? 'true' : 'false' }
1e812b19 50
c25fbf05 51sub _format_as_unset { 'unset' }
e442aff8 52
c25fbf05 53sub _format_as_array {
54 my ($self, $members) = @_;
55 join ' ', '{[', (map $self->_format($_), @$members), ']}';
1e812b19 56}
57
c25fbf05 58sub _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 68sub _format_as_statement {
69 my ($self, $parts) = @_;
70 join ' ', map $self->_format($_), @$parts;
061f9d55 71}
72
c25fbf05 73sub _format_as_value_path {
74 my ($self, $parts) = @_;
75 join '.', map $self->_format_as_maybe_bareword($_), @$parts;
693f2d6d 76}
1e812b19 77
c25fbf05 78sub _format_as_list {
79 my ($self, $members) = @_;
80 join "\n", '{', (
81 map $self->_format_indented($self->curry::_format($_)), @$members
82 ), '}';
1e812b19 83}
84
c25fbf05 85sub _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 95sub _format_as_block {
96 my ($self, $members) = @_;
97 join "\n", '{', (
98 map $self->_format_indented($self->curry::_format($_)), @$members
99 ), '}';
56f90161 100}
101
381e8dad 1021;