| /* | |
| * Copyright (C) 2025 The Android Open Source Project | |
| * | |
| * Licensed under the Apache License, Version 2.0 (the "License"); | |
| * you may not use this file except in compliance with the License. | |
| * You may obtain a copy of the License at | |
| * | |
| * http://www.apache.org/licenses/LICENSE-2.0 | |
| * | |
| * Unless required by applicable law or agreed to in writing, software | |
| * distributed under the License is distributed on an "AS IS" BASIS, | |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| * See the License for the specific language governing permissions and | |
| * limitations under the License. | |
| */ | |
| #include "src/trace_processor/util/simple_json_serializer.h" | |
| #include <cstdint> | |
| #include <functional> | |
| #include <string> | |
| #include <string_view> | |
| #include <utility> | |
| #include "src/trace_processor/util/json_serializer.h" | |
| namespace perfetto::trace_processor::json { | |
| // JsonDictSerializer implementation - delegates to JsonSerializer | |
| JsonDictSerializer::JsonDictSerializer(JsonSerializer& serializer) | |
| : serializer_(serializer) {} | |
| void JsonDictSerializer::AddNull(std::string_view key) { | |
| serializer_.Key(key); | |
| serializer_.NullValue(); | |
| } | |
| void JsonDictSerializer::AddBool(std::string_view key, bool value) { | |
| serializer_.Key(key); | |
| serializer_.BoolValue(value); | |
| } | |
| void JsonDictSerializer::AddInt(std::string_view key, int64_t value) { | |
| serializer_.Key(key); | |
| serializer_.NumberValue(value); | |
| } | |
| void JsonDictSerializer::AddUint(std::string_view key, uint64_t value) { | |
| serializer_.Key(key); | |
| serializer_.NumberValue(value); | |
| } | |
| void JsonDictSerializer::AddDouble(std::string_view key, double value) { | |
| serializer_.Key(key); | |
| serializer_.DoubleValue(value); | |
| } | |
| void JsonDictSerializer::AddString(std::string_view key, | |
| std::string_view value) { | |
| serializer_.Key(key); | |
| serializer_.StringValue(value); | |
| } | |
| void JsonDictSerializer::AddDict( | |
| std::string_view key, | |
| std::function<void(JsonDictSerializer&)> dict_writer) { | |
| serializer_.Key(key); | |
| serializer_.OpenObject(); | |
| JsonDictSerializer nested(serializer_); | |
| dict_writer(nested); | |
| serializer_.CloseObject(); | |
| } | |
| void JsonDictSerializer::AddArray( | |
| std::string_view key, | |
| std::function<void(JsonArraySerializer&)> array_writer) { | |
| serializer_.Key(key); | |
| serializer_.OpenArray(); | |
| JsonArraySerializer nested(serializer_); | |
| array_writer(nested); | |
| serializer_.CloseArray(); | |
| } | |
| void JsonDictSerializer::Add( | |
| std::string_view key, | |
| std::function<void(JsonValueSerializer&&)> value_writer) { | |
| serializer_.Key(key); | |
| value_writer(JsonValueSerializer(serializer_)); | |
| } | |
| // JsonArraySerializer implementation - delegates to JsonSerializer | |
| JsonArraySerializer::JsonArraySerializer(JsonSerializer& serializer) | |
| : serializer_(serializer) {} | |
| void JsonArraySerializer::AppendNull() { | |
| serializer_.NullValue(); | |
| } | |
| void JsonArraySerializer::AppendBool(bool value) { | |
| serializer_.BoolValue(value); | |
| } | |
| void JsonArraySerializer::AppendInt(int64_t value) { | |
| serializer_.NumberValue(value); | |
| } | |
| void JsonArraySerializer::AppendUint(uint64_t value) { | |
| serializer_.NumberValue(value); | |
| } | |
| void JsonArraySerializer::AppendDouble(double value) { | |
| serializer_.DoubleValue(value); | |
| } | |
| void JsonArraySerializer::AppendString(std::string_view value) { | |
| serializer_.StringValue(value); | |
| } | |
| void JsonArraySerializer::AppendDict( | |
| std::function<void(JsonDictSerializer&)> dict_writer) { | |
| serializer_.OpenObject(); | |
| JsonDictSerializer nested(serializer_); | |
| dict_writer(nested); | |
| serializer_.CloseObject(); | |
| } | |
| void JsonArraySerializer::AppendArray( | |
| std::function<void(JsonArraySerializer&)> array_writer) { | |
| serializer_.OpenArray(); | |
| JsonArraySerializer nested(serializer_); | |
| array_writer(nested); | |
| serializer_.CloseArray(); | |
| } | |
| void JsonArraySerializer::Append( | |
| std::function<void(JsonValueSerializer&&)> value_writer) { | |
| value_writer(JsonValueSerializer(serializer_)); | |
| } | |
| // JsonValueSerializer implementation - delegates to JsonSerializer | |
| JsonValueSerializer::JsonValueSerializer(JsonSerializer& serializer) | |
| : serializer_(serializer) {} | |
| void JsonValueSerializer::WriteNull() && { | |
| serializer_.NullValue(); | |
| } | |
| void JsonValueSerializer::WriteBool(bool value) && { | |
| serializer_.BoolValue(value); | |
| } | |
| void JsonValueSerializer::WriteInt(int64_t value) && { | |
| serializer_.NumberValue(value); | |
| } | |
| void JsonValueSerializer::WriteUint(uint64_t value) && { | |
| serializer_.NumberValue(value); | |
| } | |
| void JsonValueSerializer::WriteDouble(double value) && { | |
| serializer_.DoubleValue(value); | |
| } | |
| void JsonValueSerializer::WriteString(std::string_view value) && { | |
| serializer_.StringValue(value); | |
| } | |
| void JsonValueSerializer::WriteDict( | |
| std::function<void(JsonDictSerializer&)> dict_writer) && { | |
| serializer_.OpenObject(); | |
| JsonDictSerializer nested(serializer_); | |
| dict_writer(nested); | |
| serializer_.CloseObject(); | |
| } | |
| void JsonValueSerializer::WriteArray( | |
| std::function<void(JsonArraySerializer&)> array_writer) && { | |
| serializer_.OpenArray(); | |
| JsonArraySerializer nested(serializer_); | |
| array_writer(nested); | |
| serializer_.CloseArray(); | |
| } | |
| // Main entry point | |
| std::string SerializeJson( | |
| std::function<void(JsonValueSerializer&&)> value_writer) { | |
| JsonSerializer serializer; | |
| value_writer(JsonValueSerializer(serializer)); | |
| return serializer.ToString(); | |
| } | |
| } // namespace perfetto::trace_processor::json |