#!/usr/bin/env perl
# PODNAME: itm_read_simple
# ABSTRACT: Simple ITM Reader

use strict;
use warnings;
use AnyEvent;
use AnyEvent::Handle;
use AnyEvent::ITM;
use Term::ANSIColor qw( colored );

$|=1;

our @colors = (
  'bright_white on_black',
  'bright_yellow on_black',
  'bright_green on_black',
  'bright_cyan on_black',
  'bright_blue on_black',
  'bright_red on_black',
  'bright_magenta on_black',
  'bright_white on_blue',
  'bright_yellow on_blue',
  'bright_green on_blue',
  'bright_cyan on_blue',
  'bright_red on_blue',
  'bright_magenta on_blue',
  'bright_black on_red',
  'bright_white on_red',
  'bright_yellow on_red',
  'bright_green on_red',
  'bright_green on_red',
  'bright_cyan on_red',
  'blue on_red',
  'bright_black on_green',
  'blue on_green',
  'bright_red on_green',
  'bright_magenta on_green',
  'bright_black on_magenta',
  'bright_white on_magenta',
  'bright_yellow on_magenta',
  'bright_green on_magenta',
  'bright_cyan on_magenta',
  'blue on_magenta',
  'black on_bright_white',
  'blue on_bright_white',
);

my $file = shift or die qq{usage: $0 filename};
open my $fh, '<', $file or die qq{can't open file: $file};
my $cv = AE::cv;
my $handle = create_handle();

sub create_handle {
  new AnyEvent::Handle
  fh => $fh,
  on_error => sub {
    my ($handle, $fatal, $message) = @_;
    $handle->destroy;
    undef $handle;
    $cv->send("$fatal: $message");
  },
  on_eof => sub {
    $handle->destroy;
    undef $handle;
    $handle = create_handle();
  },
  on_read => sub {
    my $handle = shift;
    $handle->push_read(itm => sub {
      my ($handle, $itm) = @_;
      if (ref $itm eq 'ITM::Instrumentation') {
        print colored($itm->payload,$colors[$itm->source]);
      }
    });
  };
}

warn $cv->recv;

__END__

=pod

=head1 NAME

itm_read_simple - Simple ITM Reader

=head1 VERSION

version 0.002

=head1 AUTHOR

Torsten Raudssus <torsten@raudss.us>

=head1 COPYRIGHT AND LICENSE

This software is copyright (c) 2015 by Torsten Raudssus.

This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.

=cut
