#!/usr/bin/env raku

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 $m   = TEST.new;
$m.subscribe(:destination<INFO>);

$m.post: :header('no payload - just a lowercase header'), :unused-switch;
$m.post: 'Payload1 - has a lowercase header with a payload indent=2', :header('payload1 header'), :2indent;
$m.post: 'Payload2 - header with a payload indent=4 now', :header('payload2 header'), :4indent;
$m.unsubscribe(:destination<INFO>);
$m.post: 'Payload3 - nothing subscribed, will not be processed';

$m.subscribe(:destination<NOTE>);
$m.post: 'Payload4 - this one shows up as a note';
$m.unsubscribe(:destination<NOTE>);
$m.post: 'Payload5 - gone again';
$m.subscribe(:destination<NOTE>);
$m.post: 'Payload6 - note is back after skipping a beat';

$m.subscribe(:destination<DIAG>);
$m.post: 'Payload7 - both note & diag are subscribed now';
$m.unsubscribe(:destination<DIAG>);
