1 package DX::TraceFormatter;
3 use Scalar::Util qw(blessed);
5 use List::Util qw(min);
8 has ambient_indent_level => (
9 is => 'rwp', lazy => 1, clearer => 1, default => 0
15 my ($self, $thing) = @_;
16 local our $Indent_Level = $self->ambient_indent_level;
17 my $unindented = $self->_format($thing);
18 my $indent_level = min($Indent_Level, $self->ambient_indent_level);
19 (my $indented = $unindented)
20 =~ s/^/${\($self->indent_by x $indent_level)}/mg;
25 my ($self, $thing) = @_;
26 my ($as, $data) = @{blessed($thing) ? $thing->for_deparse : $thing};
27 $self->${\"_format_as_${as}"}($data);
30 sub _format_indented {
33 local $Indent_Level = $Indent_Level + 1;
34 my $unindented = $cb->();
35 (my $indented = $unindented) =~ s/^/${\$self->indent_by}/mg;
39 sub _format_as_string {
40 my ($self, $val) = @_;
41 # TODO: multiline handling
42 if ($val =~ /^\w+$/) {
49 sub _format_as_symbol { $_[1] }
51 sub _format_as_maybe_bareword {
52 my ($self, $maybe_bareword) = @_;
53 # should stringify if required
54 return $maybe_bareword;
57 sub _format_as_number { $_[1] }
59 sub _format_as_boolean { $_[1] ? 'true' : 'false' }
61 sub _format_as_unset { 'unset' }
63 sub _format_as_array {
64 my ($self, $members) = @_;
65 join ' ', '{[', (map $self->_format($_), @$members), ']}';
69 my ($self, $members) = @_;
72 $self->_format_as_maybe_bareword($_),
73 $self->_format($members->{$_}),
74 ), sort keys %$members
78 sub _format_as_statement {
79 my ($self, $parts) = @_;
80 join ' ', map $self->_format($_), @$parts;
83 sub _format_as_value_path {
84 my ($self, $parts) = @_;
85 join '.', map $self->_format_as_maybe_bareword($_), @$parts;
89 my ($self, $members) = @_;
91 map $self->_format_indented($self->curry::_format($_)), @$members
95 sub _format_as_pairs {
96 my ($self, $members) = @_;
98 map $self->_format_indented(sub {
99 $self->_format_as_maybe_bareword($_->[0])
100 .' '.$self->_format($_->[1])
105 sub _format_as_block {
106 my ($self, $members) = @_;
108 map $self->_format_indented($self->curry::_format($_)), @$members
112 sub _format_as_enter_block {
114 $self->_set_ambient_indent_level($self->ambient_indent_level + 1);
118 sub _format_as_leave_block {
120 $self->_set_ambient_indent_level($self->ambient_indent_level - 1);