#pragma once #include "serializer.h" #include "lsRequestId.h" #include "LibLsp/JsonRpc/message.h" #include "LibLsp/lsp/method_type.h" struct ResponseInMessage :public LspMessage { lsRequestId id; std::string m_methodType; virtual MethodType GetMethodType() const override { return m_methodType.data(); }; virtual void SetMethodType(MethodType _type) override { m_methodType = _type; }; Kind GetKid() override { return RESPONCE_MESSAGE; } virtual bool IsErrorType() { return false; } }; template struct BaseResponseMessage : ResponseInMessage { void ReflectWriter(Writer& writer) override { Reflect(writer, static_cast(*this)); } static std::unique_ptr ReflectReader(Reader& visitor) { TDerived* temp = new TDerived(); std::unique_ptr message = std::unique_ptr(temp); // Reflect may throw and *message will be partially deserialized. Reflect(visitor, static_cast(*temp)); return message; } }; template struct ResponseMessage : BaseResponseMessage { T result; void swap(ResponseMessage& arg) noexcept { std::swap(result, arg.result); this->id.swap(arg.id); this->m_methodType.swap(arg.m_methodType); } }; template struct ResponseError : BaseResponseMessage { T error; bool IsErrorType() override { return true; } void swap(ResponseError& arg) noexcept { this->id.swap(arg.id); this->m_methodType.swap(arg.m_methodType); std::swap(error, arg.error); } };