#!/usr/bin/env perl6

use     Terminal::ANSIColor;
need    MessageStream::Message;
need    MessageStream;

class TEST does MessageStream {

    method INFO-receive (MessageStream::Message:D $message) {
        my @tc-header;
        if $message.options<header>:exists {
            @tc-header = do .tc for $message.options<header>.split: /\s+/;
        }
        $*OUT.put: colored(@tc-header.join(' '), 'green bold underline') if @tc-header.elems;
        $*OUT.put: ' ' x $message.options<indent> ~ colored($message.payload, 'green') if $message.payload;
    }
    method NOTE-receive (MessageStream::Message:D $message) {
        $*ERR.put: colored($message.payload, 'red') if $message.payload;
    }
    method DIAG-receive (MessageStream::Message:D $message) {
        $*ERR.put: colored($message.payload, 'black on_white') if $message.payload;
    }
}

my $info    = TEST.new;
$info.subscribe(:destination<INFO>);

$info.post: :header('no payload - just a lowercase source header'), :unused-switch;
$info.post: 'INFO Message1 - has a lowercase header, payload indent=2', :header('test header'), :2indent;
$info.post: 'INFO Message2 - same header but payload indent=4 now', :header('test header'), :4indent;
$info.unsubscribe(:destination<INFO>);
$info.post: 'INFO Message3 - unsubscribed/will not be processed';

my $note    = TEST.new;
$note.post: "NOTE Message1 - won't see this, not subscribed yet";
$note.subscribe(:destination<NOTE>);
$note.post: 'NOTE Message2 - this one shows up';
$note.unsubscribe(:destination<NOTE>);
$note.post: 'NOTE Message3 - gone again';
$note.subscribe(:destination<NOTE>);
$note.post: 'NOTE Message4 - note is back after skipping a beat';

my $diag    = TEST.new;
$diag.post: 'DIAG Message1 - not displayed';
$diag.subscribe(:destination<DIAG>);
$diag.post: 'DIAG Message2 - diags are running now, black on-white - nice';
$diag.unsubscribe(:destination<DIAG>);
