| /* 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 <utility> | |
| #include <vector> | |
| #include <cm3p/json/writer.h> | |
| #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<cmSbomObject> 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<std::string> 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(); | |
| } |