/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying file LICENSE.rst or https://cmake.org/licensing for details. */ #include "cmSpdxSerializer.h" #include #include #include #include "cmSbomObject.h" cmSpdxSerializer::cmSpdxSerializer() { Json::StreamWriterBuilder builder = Json::StreamWriterBuilder(); builder["indentation"] = " "; Writer.reset(builder.newStreamWriter()); } void cmSpdxSerializer::BeginObject() { CurrentValue = Json::objectValue; } void cmSpdxSerializer::BeginArray() { CurrentValue = Json::arrayValue; } void cmSpdxSerializer::EndObject() { } void cmSpdxSerializer::EndArray() { } void cmSpdxSerializer::AddReference(std::string const& id) { CurrentValue = id; } void cmSpdxSerializer::AddString(std::string const& key, std::string const& value) { if (!value.empty()) { CurrentValue[key] = value; } } void cmSpdxSerializer::AddVisitable(std::string const& key, cmSbomObject const& visitable) { if (visitable.IsNull()) { return; } Json::Value parentValue = std::move(CurrentValue); visitable.Serialize(*this); Json::Value childValue = std::move(CurrentValue); CurrentValue = std::move(parentValue); CurrentValue[key] = std::move(childValue); } void cmSpdxSerializer::AddVectorIfPresent(std::string const& key, std::vector const& vec) { if (vec.empty()) { return; } Json::Value parentValue = std::move(CurrentValue); Json::Value childValue(Json::arrayValue); for (auto const& item : vec) { if (item.IsNull()) { continue; } item.Serialize(*this); if (!CurrentValue.isNull()) { childValue.append(std::move(CurrentValue)); } } CurrentValue = std::move(parentValue); CurrentValue[key] = std::move(childValue); } void cmSpdxSerializer::AddVectorIfPresent(std::string const& key, std::vector const& vec) { if (vec.empty()) { return; } Json::Value parentValue = std::move(CurrentValue); Json::Value childValue(Json::arrayValue); for (auto const& item : vec) { if (item.empty()) { continue; } childValue.append(item); } CurrentValue = std::move(parentValue); CurrentValue[key] = std::move(childValue); } bool cmSpdxSerializer::WriteSbom(std::ostream& os, cmSbomObject const& document) { if (document.IsNull()) { return false; } document.Serialize(*this); Writer->write(CurrentValue, &os); return os.good(); }