MessagingPort.kt

package com.hexagontk.messaging

import kotlin.reflect.KClass

// TODO 'unsubscribe' and 'call' (publish and wait response)
interface MessagingPort {
    fun <T : Message> consume(
        type: KClass<T>, address: String, decoder: (Map<String, *>) -> T, consumer: (T) -> Unit
    )

    fun publish(message: Message, address: String)

    fun <T : Message> consume(
        type: KClass<T>, decoder: (Map<String, *>) -> T, consumer: (T) -> Unit
    ) {
        consume(type, type.java.name, decoder, consumer)
    }

    fun publish(message: Message) {
        publish(message, message.javaClass.name)
    }
}