module; import glaze; export module lsp.codec.facade; import std; import lsp.codec.transformer; import lsp.protocol.common.basic_types; export namespace lsp::codec { template std::optional Deserialize(const std::string& json); template std::optional Serialize(const T& obj); inline constexpr auto ToLSPAny = [](const auto& value) { return LSPAnyConverter::ToLSPAny(value); }; inline constexpr auto FromLSPAny = [](const auto& input) -> T { using InputType = std::decay_t; protocol::LSPAny any; if constexpr (std::is_same_v>) any = std::visit([](const auto& v) -> protocol::LSPAny { return v; }, input); else any = input; return LSPAnyConverter::FromLSPAny(any); }; namespace check { bool IsObject(const protocol::LSPAny& any); bool IsArray(const protocol::LSPAny& any); bool IsString(const protocol::LSPAny& any); bool IsNumber(const protocol::LSPAny& any); bool IsBool(const protocol::LSPAny& any); bool IsNull(const protocol::LSPAny& any); } namespace debug { std::string GetTypeName(const protocol::LSPAny& any); std::string GetIdString(const std::variant& id); } } namespace lsp::codec { // ==================== JSON 序列化/反序列化 ==================== template std::optional Deserialize(const std::string& json) { T obj; auto ce = glz::read_json(obj, json); if (ce) return std::nullopt; else return obj; } template std::optional Serialize(const T& obj) { std::string json; auto ce = glz::write_json(obj, json); if (ce) return std::nullopt; else return json; } // ==================== 类型检查 ==================== namespace check { inline bool IsObject(const protocol::LSPAny& any) { return any.Is(); } inline bool IsArray(const protocol::LSPAny& any) { return any.Is(); } inline bool IsString(const protocol::LSPAny& any) { return any.Is(); } inline bool IsNumber(const protocol::LSPAny& any) { return any.Is() || any.Is() || any.Is(); } inline bool IsBool(const protocol::LSPAny& any) { return any.Is(); } inline bool IsNull(const protocol::LSPAny& any) { return any.Is(); } } // ==================== 调试工具 ==================== namespace debug { inline std::string GetTypeName(const protocol::LSPAny& any) { if (any.Is()) return "LSPObject"; if (any.Is()) return "LSPArray"; if (any.Is()) return "string"; if (any.Is()) return "integer"; if (any.Is()) return "uinteger"; if (any.Is()) return "decimal"; if (any.Is()) return "boolean"; if (any.Is()) return "null"; return "unknown"; } inline std::string GetIdString(const std::variant& id) { return std::visit([](const auto& value) -> std::string { if constexpr (std::is_same_v, int>) return std::to_string(value); else return value; }, id); } } }