File Coverage

blib/lib/WebService/Mattermost/Helper/Table.pm
Criterion Covered Total %
statement 27 27 100.0
branch n/a
condition 2 2 100.0
subroutine 4 4 100.0
pod n/a
total 33 33 100.0


line stmt bran cond sub pod time code
1             package WebService::Mattermost::Helper::Table;
2:

3: # ABSTRACT: Markdown table generator. 4:
5: use Moo;
6: use Types::Standard qw(ArrayRef Enum Str);
7:
8: ################################################################################
9:
10: has alignment => (is => 'ro', isa => ArrayRef[Enum[ qw(l r c) ]], required => 0);
11: has values => (is => 'ro', isa => ArrayRef, required => 1);
12: has headers => (is => 'ro', isa => ArrayRef, required => 1);
13:
14: has _headers => (is => 'ro', isa => Str, lazy => 1, builder => '_build__headers');
15: has table => (is => 'ro', isa => Str, lazy => 1, builder => '_build_table');
16:
17: has divider => (is => 'ro', isa => Str, default => q{|});
18: has align_l => (is => 'ro', isa => Str, default => ':----|');
19: has align_r => (is => 'ro', isa => Str, default => '----:|');
20: has align_c => (is => 'ro', isa => Str, default => ':---:|');
21:
22: ################################################################################
23:
24: sub _build__headers {
25: my $self = shift;
26:
27: my $headers = q{};
28:
29: foreach my $h (@{$self->headers}) {
30: $headers .= sprintf '%s %s', $self->divider, $h;
31: }
32:
33: $headers .= $self->divider."\n".$self->divider;
34:
35: for (my $i = 0; $i < scalar @{$self->headers}; $i++) {
36: my $al = $self->alignment && $self->alignment->[$i] || 'l';
37: my $attr = "align_${al}";
38:
39: $headers .= $self->$attr;
40: }
41:
42: return $headers;
43: }
44:
45: sub _build_table {
46: my $self = shift;
47:
48: my $table = $self->_headers."\n";
49:
50: foreach my $v (@{$self->values}) {
51: $table .= $self->divider;
52: $table .= join $self->divider, @{$v};
53: $table .= $self->divider."\n";
54: }
55:
56: return $table;
57: }
58:
59: ################################################################################
60:
61: 1;
62:
63: __END__
64:
65: =pod
66:
67: =encoding UTF-8
68:
69: =head1 NAME
70:
71: WebService::Mattermost::Helper::Table - Markdown table generator.
72:
73: =head1 VERSION
74:
75: version 0.28
76:
77: =head1 DESCRIPTION
78:
79: Format text as tables for Mattermost.
80:
81: =head2 USAGE
82:
83: use WebService::Mattermost::Helper::Table;
84:
85: my $helper = WebService::Mattermost::Helper::Table->new({
86: alignment => [ qw(r l l) ],
87: headers => [ 'ID', 'Title', 'Date Created' ],
88: values => [
89: [ 1, 'First row', '2018-09-16' ],
90: [ 2, 'Second row', '2018-09-17' ],
91: [ 3, 'Third row', '2018-09-17' ],
92: ],
93: });
94:
95: print $helper->table;
96:
97: =head1 SEE ALSO
98:
99: =over 4
100:
101: =item L<Mattermost Markdown|https://docs.mattermost.com/help/messaging/formatting-text.html#tables>
102:
103: =back
104:
105: =head1 AUTHOR
106:
107: Mike Jones <mike@netsplit.org.uk>
108:
109: =head1 COPYRIGHT AND LICENSE
110:
111: This software is Copyright (c) 2020 by Mike Jones.
112:
113: This is free software, licensed under:
114:
115: The MIT (X11) License
116:
117: =cut
118: