diff --git a/include/CNZSL/Serializer.h b/include/CNZSL/Serializer.h new file mode 100644 index 0000000..eef83eb --- /dev/null +++ b/include/CNZSL/Serializer.h @@ -0,0 +1,39 @@ +/* + Copyright (C) 2024 kbz_8 ( contact@kbz8.me ) + This file is part of the "Nazara Shading Language - C Binding" project + For conditions of distribution and use, see copyright notice in Config.hpp +*/ + +#pragma once + +#ifndef CNZSL_SERIALIZER_H +#define CNZSL_SERIALIZER_H + +#include +#include + +#include + +#ifdef __cplusplus +extern "C" +{ +#endif + +typedef struct nzslSerializer nzslSerializer; +typedef struct nzslDeserializer nzslDeserializer; + +CNZSL_API nzslSerializer* nzslSerializerCreate(void); +CNZSL_API void nzslSerializerDestroy(nzslSerializer* serializerPtr); +CNZSL_API void nzslSerializeShader(nzslSerializer* serializerPtr, const nzslModule* modulePtr); +CNZSL_API const char* nzslSerializerGetLastError(const nzslSerializer* serializerPtr); + +CNZSL_API nzslDeserializer* nzslDeserializerCreate(const void* data, size_t dataSize); +CNZSL_API void nzslDeserializerDestroy(nzslDeserializer* deserializerPtr); +CNZSL_API nzslModule* nzslDeserializeShader(nzslDeserializer* deserializerPtr); +CNZSL_API const char* nzslDeserializerGetLastError(const nzslDeserializer* deserializerPtr); + +#ifdef __cplusplus +} +#endif + +#endif /* CNZSL_SERIALIZER_H */ diff --git a/src/CNZSL/Serializer.cpp b/src/CNZSL/Serializer.cpp new file mode 100644 index 0000000..16cd7f1 --- /dev/null +++ b/src/CNZSL/Serializer.cpp @@ -0,0 +1,89 @@ +// Copyright (C) 2024 kbz_8 ( contact@kbz8.me ) +// This file is part of the "Nazara Shading Language - C Binding" project +// For conditions of distribution and use, see copyright notice in Config.hpp + +#include +#include +#include +#include +#include +#include +#include + +extern "C" +{ + CNZSL_API nzslSerializer* nzslSerializerCreate(void) + { + return new nzslSerializer; + } + + CNZSL_API void nzslSerializerDestroy(nzslSerializer* serializerPtr) + { + delete serializerPtr; + } + + CNZSL_API void nzslSerializeShader(nzslSerializer* serializerPtr, const nzslModule* modulePtr) + { + assert(serializerPtr); + assert(modulePtr); + + try + { + nzsl::Ast::SerializeShader(serializerPtr->serializer, *modulePtr->module); + } + catch(std::exception& e) + { + serializerPtr->lastError = fmt::format("nzslSerializeShader failed: {}", e.what()); + } + catch(...) + { + serializerPtr->lastError = "nzslSerializeShader failed with unknown error"; + } + } + + CNZSL_API const char* nzslSerializerGetLastError(const nzslSerializer* serializerPtr) + { + assert(serializerPtr); + return serializerPtr->lastError.c_str(); + } + + CNZSL_API nzslDeserializer* nzslDeserializerCreate(const void* data, size_t dataSize) + { + return new nzslDeserializer(data, dataSize); + } + + CNZSL_API void nzslDeserializerDestroy(nzslDeserializer* deserializerPtr) + { + delete deserializerPtr; + } + + CNZSL_API nzslModule* nzslDeserializeShader(nzslDeserializer* deserializerPtr) + { + assert(deserializerPtr); + + try + { + nzsl::Ast::ModulePtr module = nzsl::Ast::DeserializeShader(deserializerPtr->deserializer); + + nzslModule* modulePtr = nzslModuleCreate(); + modulePtr->module = std::move(module); + return modulePtr; + } + catch(std::exception& e) + { + deserializerPtr->lastError = fmt::format("nzslDeserializeShader failed: {}", e.what()); + return nullptr; + } + catch(...) + { + deserializerPtr->lastError = "nzslDeserializeShader failed with unknown error"; + return nullptr; + } + } + + CNZSL_API const char* nzslDeserializerGetLastError(const nzslDeserializer* deserializerPtr) + { + assert(deserializerPtr); + return deserializerPtr->lastError.c_str(); + } +} diff --git a/src/CNZSL/Structs/Serializer.hpp b/src/CNZSL/Structs/Serializer.hpp new file mode 100644 index 0000000..cb972f1 --- /dev/null +++ b/src/CNZSL/Structs/Serializer.hpp @@ -0,0 +1,29 @@ +// Copyright (C) 2024 kbz_8 ( contact@kbz8.me ) +// This file is part of the "Nazara Shading Language - C Binding" project +// For conditions of distribution and use, see copyright notice in Config.hpp + +#pragma once + +#ifndef CNZSL_STRUCTS_SERIALIZER_HPP +#define CNZSL_STRUCTS_SERIALIZER_HPP + +#include + +#include +#include + +struct nzslSerializer +{ + nzsl::Serializer serializer; + std::string lastError; +}; + +struct nzslDeserializer +{ + nzsl::Deserializer deserializer; + std::string lastError; + + nzslDeserializer(const void* data, size_t dataSize) : deserializer(data, dataSize) {} +}; + +#endif // CNZSL_STRUCTS_SERIALIZER_HPP