package com.lingniu.ingest.api.spi;

import com.lingniu.ingest.api.ProtocolId;

import java.util.List;

/**
 * 协议插件 SPI。每个协议模块提供一个实现，由 {@code ProtocolPluginRegistry} 通过 ServiceLoader
 * 或 Spring Bean 方式发现并装配。
 *
 * @param <I> 协议解码后的消息类型
 * @param <O> 下行消息类型（无下行的协议用 {@link Void}）
 */
public interface ProtocolPlugin<I, O> {

    ProtocolId id();

    FrameDecoder<I> decoder();

    FrameEncoder<O> encoder();

    EventMapper<I> eventMapper();

    /**
     * 插件自带的协议特定 Handler 列表（可选）。
     * 通常推荐使用 {@code @ProtocolHandler} + Spring Bean 的方式注册，此处返回空列表。
     */
    default List<MessageHandler<I>> builtinHandlers() {
        return List.of();
    }
}
