author Dustin J. Mitchell <>
Mon, 02 Oct 2017 18:22:56 +0000
changeset 399728 0f0395687d36597098e4248457ed69f092c39f8f
parent 392280 abe5e28c49908b8a94196b73a787656a546bac9c
permissions -rw-r--r--
Bug 1403519 - only build docs when necessary r=gps This marks **/docs/** as exclusively docs, and code that is autodoc'd as inclusively docs. That means that a change that purely modifies documentation files will *only* run `docs` tasks, while a change that modifies autodoc'd source code will *additionaly* run `docs` tasks. The tasks do not run by default. MozReview-Commit-ID: G9tOK0AwtrI

/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at */

#ifndef JSONFormatter_h
#define JSONFormatter_h

#include <memory>
#include <string>

// A very basic JSON formatter that records key/value pairs and outputs a JSON
// object that contains only non-object data.
class JSONFormatter {
  // Of these fields, only mEscapedStringValue is owned by this class. All the
  // others are expected to outlive the class (which is typically allocated
  // on-stack).
  struct Property {
    const char *Name;
    std::string StringValue;
    int IntValue;
    bool IsString;

    Property() {}

    Property(const char* Name, std::string String)
      : Name(Name), StringValue(std::move(String)), IsString(true) {}

    Property(const char* Name, int Int)
      : Name(Name), IntValue(Int), IsString(false) {}

  static const int kMaxProperties = 32;

  Property Properties[kMaxProperties];
  int PropertyCount;

  // Length of the generated JSON output.
  size_t Length;

  std::string escape(std::string Input);

  JSONFormatter() : PropertyCount(0), Length(0) {}

  void add(const char *Name, const char *Value);
  void add(const char *Name, std::string Value);
  void add(const char *Name, int Value);

  void format(std::string &Result);