| Akron | 9642cf3 | 2017-10-30 12:42:14 +0100 | [diff] [blame] | 1 | package Krawfish::Koral::Report; |
| Akron | ee06a13 | 2017-12-08 16:59:27 +0100 | [diff] [blame] | 2 | use strict; |
| 3 | use warnings; |
| Akron | 290f59f | 2017-08-17 21:55:07 +0200 | [diff] [blame] | 4 | use Role::Tiny; |
| Akron | ee06a13 | 2017-12-08 16:59:27 +0100 | [diff] [blame] | 5 | use Krawfish::Log; |
| 6 | |
| Akron | 71fc0ec | 2017-11-02 17:34:21 +0100 | [diff] [blame] | 7 | requires qw/error |
| 8 | warning |
| 9 | message |
| 10 | has_error |
| 11 | has_warning |
| 12 | has_message/; |
| Akron | ddf077a | 2016-11-05 15:00:00 +0100 | [diff] [blame] | 13 | |
| Akron | 7aed51c | 2017-10-31 16:23:49 +0100 | [diff] [blame] | 14 | # Report on errors, warnings an anything else |
| Akron | 4a46e6e | 2017-08-16 17:49:16 +0200 | [diff] [blame] | 15 | |
| Akron | fa42511 | 2017-12-14 22:20:28 +0200 | [diff] [blame] | 16 | use constant { |
| 17 | CONTEXT => 'http://korap.ids-mannheim.de/ns/koral/0.6/context.jsonld', |
| 18 | DEBUG => 0 |
| 19 | }; |
| Akron | 6ce5108 | 2017-07-26 17:31:41 +0200 | [diff] [blame] | 20 | |
| Akron | a588d07 | 2017-10-13 14:45:34 +0200 | [diff] [blame] | 21 | |
| Akron | ddf077a | 2016-11-05 15:00:00 +0100 | [diff] [blame] | 22 | # Add error |
| 23 | sub error { |
| Akron | 6ce5108 | 2017-07-26 17:31:41 +0200 | [diff] [blame] | 24 | my $self = shift; |
| 25 | print_log('info', 'Error: ' . join(' ', @_)) if DEBUG; |
| 26 | return $self->_info('error', @_); |
| Akron | ddf077a | 2016-11-05 15:00:00 +0100 | [diff] [blame] | 27 | }; |
| 28 | |
| Akron | a588d07 | 2017-10-13 14:45:34 +0200 | [diff] [blame] | 29 | |
| 30 | # Add warning |
| Akron | 8aee4a6 | 2016-11-14 21:33:12 +0100 | [diff] [blame] | 31 | sub warning { |
| Akron | 6ce5108 | 2017-07-26 17:31:41 +0200 | [diff] [blame] | 32 | my $self = shift; |
| 33 | print_log('info', 'Warning: ' . join(' ', @_)) if DEBUG; |
| 34 | return $self->_info('warning', @_); |
| Akron | 8aee4a6 | 2016-11-14 21:33:12 +0100 | [diff] [blame] | 35 | }; |
| 36 | |
| Akron | a588d07 | 2017-10-13 14:45:34 +0200 | [diff] [blame] | 37 | |
| 38 | # Add message |
| Akron | 8aee4a6 | 2016-11-14 21:33:12 +0100 | [diff] [blame] | 39 | sub message { |
| Akron | 6ce5108 | 2017-07-26 17:31:41 +0200 | [diff] [blame] | 40 | my $self = shift; |
| 41 | print_log('info', 'Message: ' . join(' ', @_)) if DEBUG; |
| 42 | return $self->_info('message', @_); |
| Akron | 8aee4a6 | 2016-11-14 21:33:12 +0100 | [diff] [blame] | 43 | }; |
| Akron | 6621e11 | 2016-11-05 17:21:39 +0100 | [diff] [blame] | 44 | |
| Akron | a588d07 | 2017-10-13 14:45:34 +0200 | [diff] [blame] | 45 | |
| Akron | 6621e11 | 2016-11-05 17:21:39 +0100 | [diff] [blame] | 46 | # Is there an error? |
| Akron | ddf077a | 2016-11-05 15:00:00 +0100 | [diff] [blame] | 47 | sub has_error { |
| 48 | return 1 if $_[0]->{error}; |
| 49 | return; |
| 50 | }; |
| 51 | |
| Akron | 6621e11 | 2016-11-05 17:21:39 +0100 | [diff] [blame] | 52 | |
| Akron | 8aee4a6 | 2016-11-14 21:33:12 +0100 | [diff] [blame] | 53 | # Is there a warning? |
| 54 | sub has_warning { |
| 55 | return 1 if $_[0]->{warning}; |
| 56 | return; |
| 57 | }; |
| 58 | |
| 59 | |
| 60 | # Is there a warning? |
| 61 | sub has_message { |
| 62 | return 1 if $_[0]->{message}; |
| 63 | return; |
| 64 | }; |
| 65 | |
| 66 | |
| Akron | 6621e11 | 2016-11-05 17:21:39 +0100 | [diff] [blame] | 67 | # Copy information from another object |
| Akron | a588d07 | 2017-10-13 14:45:34 +0200 | [diff] [blame] | 68 | # Function |
| Akron | 6621e11 | 2016-11-05 17:21:39 +0100 | [diff] [blame] | 69 | sub copy_info_from { |
| 70 | my ($self, $obj) = @_; |
| Akron | 8aee4a6 | 2016-11-14 21:33:12 +0100 | [diff] [blame] | 71 | |
| 72 | # Copy from types |
| 73 | foreach my $type (qw/error warning message/) { |
| 74 | if ($obj->{$type}) { |
| 75 | push @{$self->{$type} //= []}, @{$obj->{$type}}; |
| 76 | }; |
| Akron | 6621e11 | 2016-11-05 17:21:39 +0100 | [diff] [blame] | 77 | }; |
| Akron | fa42511 | 2017-12-14 22:20:28 +0200 | [diff] [blame] | 78 | |
| 79 | $self; |
| Akron | 6621e11 | 2016-11-05 17:21:39 +0100 | [diff] [blame] | 80 | }; |
| 81 | |
| Akron | 8aee4a6 | 2016-11-14 21:33:12 +0100 | [diff] [blame] | 82 | |
| Akron | a84ef2d | 2017-08-07 14:45:46 +0200 | [diff] [blame] | 83 | # Copy information from another object |
| Akron | fa42511 | 2017-12-14 22:20:28 +0200 | [diff] [blame] | 84 | sub move_info_from { |
| Akron | a84ef2d | 2017-08-07 14:45:46 +0200 | [diff] [blame] | 85 | my ($self, $obj) = @_; |
| 86 | |
| 87 | # Copy from types |
| 88 | foreach my $type (qw/error warning message/) { |
| 89 | if ($obj->{$type}) { |
| 90 | push @{$self->{$type} //= []}, @{$obj->{$type}}; |
| 91 | delete $obj->{$type}; |
| 92 | }; |
| 93 | }; |
| Akron | fa42511 | 2017-12-14 22:20:28 +0200 | [diff] [blame] | 94 | |
| 95 | $self; |
| Akron | a84ef2d | 2017-08-07 14:45:46 +0200 | [diff] [blame] | 96 | }; |
| 97 | |
| 98 | |
| Akron | a588d07 | 2017-10-13 14:45:34 +0200 | [diff] [blame] | 99 | # Merge infos with a new object |
| Akron | 02c0ff2 | 2016-11-24 17:58:34 +0100 | [diff] [blame] | 100 | sub merge_info { |
| 101 | my ($self, $target) = @_; |
| 102 | copy_info_from($target, $self); |
| 103 | }; |
| 104 | |
| 105 | |
| Akron | a588d07 | 2017-10-13 14:45:34 +0200 | [diff] [blame] | 106 | # Information |
| Akron | 8aee4a6 | 2016-11-14 21:33:12 +0100 | [diff] [blame] | 107 | sub _info { |
| 108 | my $self = shift; |
| 109 | my ($type, $code, $msg, @param) = @_; |
| 110 | unless (defined $code) { |
| 111 | return $self->{$type}; |
| 112 | }; |
| 113 | push(@{$self->{$type} //= []}, [$code, $msg, @param]); |
| 114 | return $self; |
| 115 | }; |
| Akron | ddf077a | 2016-11-05 15:00:00 +0100 | [diff] [blame] | 116 | |
| Akron | a588d07 | 2017-10-13 14:45:34 +0200 | [diff] [blame] | 117 | |
| Akron | 8b3d9ff | 2017-12-13 15:01:22 +0100 | [diff] [blame] | 118 | sub to_koral_report { |
| 119 | my ($self, $type) = @_; |
| 120 | return $self->_info($type); |
| 121 | }; |
| 122 | |
| 123 | |
| 124 | # Wrap the fragment in context |
| 125 | sub to_koral_query { |
| 126 | my $self = shift; |
| 127 | my $koral = $self->to_koral_fragment; |
| 128 | $koral->{'@context'} = CONTEXT; |
| 129 | |
| Akron | fa42511 | 2017-12-14 22:20:28 +0200 | [diff] [blame] | 130 | # Add potential warnings |
| Akron | 8b3d9ff | 2017-12-13 15:01:22 +0100 | [diff] [blame] | 131 | if ($self->has_warning) { |
| 132 | $koral->{warnings} = $self->to_koral_report('warning') |
| 133 | }; |
| 134 | |
| Akron | fa42511 | 2017-12-14 22:20:28 +0200 | [diff] [blame] | 135 | # Add potential errors |
| Akron | 8b3d9ff | 2017-12-13 15:01:22 +0100 | [diff] [blame] | 136 | if ($self->has_error) { |
| 137 | $koral->{errors} = $self->to_koral_report('error') |
| 138 | }; |
| 139 | |
| Akron | fa42511 | 2017-12-14 22:20:28 +0200 | [diff] [blame] | 140 | # Add potential messages |
| Akron | 8b3d9ff | 2017-12-13 15:01:22 +0100 | [diff] [blame] | 141 | if ($self->has_message) { |
| 142 | $koral->{messages} = $self->to_koral_report('message') |
| 143 | }; |
| 144 | |
| 145 | return $koral; |
| 146 | }; |
| 147 | |
| 148 | |
| 149 | |
| Akron | ddf077a | 2016-11-05 15:00:00 +0100 | [diff] [blame] | 150 | 1; |