blob: 2fbb9049c57fb4494aa1d367399fb33855bb415d [file] [log] [blame]
// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef ZIRCON_SYSTEM_HOST_FIDL_INCLUDE_FIDL_JSON_GENERATOR_H_
#define ZIRCON_SYSTEM_HOST_FIDL_INCLUDE_FIDL_JSON_GENERATOR_H_
#include <memory>
#include <sstream>
#include <string>
#include <vector>
#include "coded_ast.h"
#include "flat_ast.h"
#include "string_view.h"
namespace fidl {
// Methods or functions named "Emit..." are the actual interface to
// the JSON output.
// Methods named "Generate..." directly generate JSON output via the
// "Emit" routines.
// Methods named "Produce..." indirectly generate JSON output by calling
// the Generate methods, and should not call the "Emit" functions
// directly.
class JSONGenerator {
public:
explicit JSONGenerator(flat::Library* library)
: library_(library) {}
~JSONGenerator() = default;
void ProduceJSON(std::ostringstream* json_file_out);
private:
enum class Position {
First,
Subsequent,
};
void GenerateEOF();
template <typename Collection>
void GenerateArray(const Collection& collection);
template <typename Callback>
void GenerateObject(Callback callback);
template <typename Type>
void GenerateObjectMember(StringView key, const Type& value,
Position position = Position::Subsequent);
template <typename T>
void Generate(const std::unique_ptr<T>& value);
template <typename T>
void Generate(const std::vector<T>& value);
void Generate(bool value);
void Generate(StringView value);
void Generate(uint64_t value);
void Generate(types::HandleSubtype value);
void Generate(types::Nullability value);
void Generate(types::PrimitiveSubtype value);
void Generate(const ast::Identifier& value);
void Generate(const ast::CompoundIdentifier& value);
void Generate(const ast::Literal& value);
void Generate(const ast::Type& value);
void Generate(const ast::Constant& value);
void Generate(const flat::Ordinal& value);
void Generate(const flat::Name& value);
void Generate(const flat::Const& value);
void Generate(const flat::Enum& value);
void Generate(const flat::Enum::Member& value);
void Generate(const flat::Interface& value);
void Generate(const flat::Interface::Method& value);
void Generate(const flat::Interface::Method::Parameter& value);
void Generate(const flat::Struct& value);
void Generate(const flat::Struct::Member& value);
void Generate(const flat::Union& value);
void Generate(const flat::Union::Member& value);
void GenerateDeclarationMapEntry(int count, const flat::Name& name, StringView decl);
flat::Library* library_;
int indent_level_;
std::ostringstream json_file_;
};
} // namespace fidl
#endif // ZIRCON_SYSTEM_HOST_FIDL_INCLUDE_FIDL_C_GENERATOR_H_