chromium/tools/mac/power/power_sampler/json_exporter.cc

// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "tools/mac/power/power_sampler/json_exporter.h"

#include <ostream>

#include "base/files/file.h"
#include "base/files/file_util.h"
#include "base/json/json_writer.h"
#include "base/memory/ptr_util.h"

namespace power_sampler {

std::unique_ptr<JsonExporter> JsonExporter::Create(base::FilePath file_path,
                                                   base::TimeTicks time_base) {
  base::File ensure_created(
      file_path, base::File::FLAG_CREATE_ALWAYS | base::File::FLAG_WRITE);
  if (!ensure_created.IsValid())
    return nullptr;

  return base::WrapUnique(new JsonExporter(std::move(file_path), time_base));
}

JsonExporter::JsonExporter(base::FilePath file_path, base::TimeTicks time_base)
    : file_path_(file_path), time_base_(time_base) {}

JsonExporter::~JsonExporter() = default;

void JsonExporter::OnStartSession(
    const DataColumnKeyUnits& data_columns_units) {
  base::Value::Dict column_labels;
  for (const auto& column : data_columns_units) {
    column_labels.Set(
        column.first.sampler_name + "_" + column.first.column_name,
        column.second);
  }
  column_labels_ = base::Value(std::move(column_labels));
}

bool JsonExporter::OnSample(base::TimeTicks sample_time,
                            const DataRow& data_row) {
  base::Value::Dict sample_value;

  sample_value.Set("sample_time", (sample_time - time_base_).InMicrosecondsF());
  for (const auto& datum : data_row) {
    sample_value.Set(datum.first.sampler_name + "_" + datum.first.column_name,
                     datum.second);
  }

  data_rows_.Append(std::move(sample_value));
  return false;
}

void JsonExporter::OnEndSession() {
  base::Value::Dict output;
  output.Set("column_labels", column_labels_.Clone());
  output.Set("data_rows", data_rows_.Clone());

  std::string json_string;
  bool success = base::JSONWriter::WriteWithOptions(
      base::Value(std::move(output)), base::JSONWriter::OPTIONS_PRETTY_PRINT,
      &json_string);

  DCHECK(success);
  success = base::WriteFile(file_path_, json_string);
  DCHECK(success) << "Failed to write JSON to file";
}

}  // namespace power_sampler