#pragma once
#include "../protocol.hpp"
#include "./common.hpp"

namespace lsp::transform
{
    /// LSPAny 转换核心类
    /// 提供所有类型的双向转换
    class LSPAnyConverter
    {
    public:
        // ==================== 任意类型 → LSPAny ====================
        
        /// 通用转换入口：任意类型 → LSPAny
        /// 根据类型特征自动分派到具体实现
        template<typename T>
        static protocol::LSPAny ToLSPAny(const T& value);

        // ==================== LSPAny → 任意类型 ====================
        
        /// 通用转换入口：LSPAny → 任意类型
        /// 根据类型特征自动分派到具体实现
        template<typename T>
        static T FromLSPAny(const protocol::LSPAny& any);

    private:
        // ==================== 辅助工具 ====================
        
        /// 提取数字（支持三种数字类型）
        template<typename T>
        static T ExtractNumber(const protocol::LSPAny& any);

        /// 通过 JSON 转换用户结构体
        template<typename T>
        static T ConvertViaJson(const protocol::LSPAny& any);

        /// 将用户结构体序列化为 LSPAny
        template<typename T>
        static protocol::LSPAny SerializeViaJson(const T& obj);
    };
}

#include "./transformer.inl"
