| Index: third_party/inspector_protocol/templates/TypeBuilder_h.template
|
| diff --git a/third_party/inspector_protocol/templates/TypeBuilder_h.template b/third_party/inspector_protocol/templates/TypeBuilder_h.template
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..553ba55f7c0de6956c1d0bf5900149a1a6c814b5
|
| --- /dev/null
|
| +++ b/third_party/inspector_protocol/templates/TypeBuilder_h.template
|
| @@ -0,0 +1,290 @@
|
| +// This file is generated
|
| +
|
| +// Copyright (c) 2016 The Chromium 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 {{"_".join(config.protocol.namespace)}}_{{domain.domain}}_h
|
| +#define {{"_".join(config.protocol.namespace)}}_{{domain.domain}}_h
|
| +
|
| +{% if config.protocol.export_header %}
|
| +#include {{format_include(config.protocol.export_header)}}
|
| +{% endif %}
|
| +#include "{{config.protocol.package}}/Protocol.h"
|
| +// For each imported domain we generate a ValueConversions struct instead of a full domain definition
|
| +// and include Domain::API version from there.
|
| +{% for name in domain.dependencies %}
|
| +#include "{{config.protocol.package}}/{{name}}.h"
|
| +{% endfor %}
|
| +{% if domain["has_exports"] %}
|
| +#include "{{config.exported.package}}/{{domain.domain}}.h"
|
| +{% endif %}
|
| +
|
| +{% for namespace in config.protocol.namespace %}
|
| +namespace {{namespace}} {
|
| +{% endfor %}
|
| +namespace {{domain.domain}} {
|
| +
|
| +// ------------- Forward and enum declarations.
|
| + {% for type in domain.types %}
|
| + {% if type.type == "object" %}
|
| + {% if "properties" in type %}
|
| +// {{type.description}}
|
| +class {{type.id}};
|
| + {% else %}
|
| +// {{type.description}}
|
| +using {{type.id}} = Object;
|
| + {% endif %}
|
| + {% elif type.type != "array" %}
|
| +// {{type.description}}
|
| +using {{type.id}} = {{resolve_type(type).type}};
|
| + {% endif %}
|
| + {% endfor %}
|
| + {% for type in domain.types %}
|
| + {% if "enum" in type %}
|
| +
|
| +namespace {{type.id}}Enum {
|
| + {% for literal in type.enum %}
|
| +{{config.protocol.export_macro}} extern const char* {{ literal | dash_to_camelcase}};
|
| + {% endfor %}
|
| +} // namespace {{type.id}}Enum
|
| + {% endif %}
|
| + {% endfor %}
|
| + {% for command in join_arrays(domain, ["commands", "events"]) %}
|
| + {% for param in join_arrays(command, ["parameters", "returns"]) %}
|
| + {% if "enum" in param %}
|
| +
|
| +namespace {{command.name | to_title_case}} {
|
| +namespace {{param.name | to_title_case}}Enum {
|
| + {% for literal in param.enum %}
|
| +{{config.protocol.export_macro}} extern const char* {{literal | dash_to_camelcase}};
|
| + {% endfor %}
|
| +} // {{param.name | to_title_case}}Enum
|
| +} // {{command.name | to_title_case }}
|
| + {% endif %}
|
| + {% endfor %}
|
| + {% endfor %}
|
| +
|
| +// ------------- Type and builder declarations.
|
| + {% for type in domain.types %}
|
| + {% if not (type.type == "object") or not ("properties" in type) %}{% continue %}{% endif %}
|
| + {% set type_def = type_definition(domain.domain + "." + type.id)%}
|
| +
|
| +// {{type.description}}
|
| +class {{config.protocol.export_macro}} {{type.id}} {% if type.exported %}: public API::{{type.id}} {% endif %}{
|
| + PROTOCOL_DISALLOW_COPY({{type.id}});
|
| +public:
|
| + static std::unique_ptr<{{type.id}}> parse(protocol::Value* value, ErrorSupport* errors);
|
| +
|
| + ~{{type.id}}() { }
|
| + {% for property in type.properties %}
|
| + {% if "enum" in property %}
|
| +
|
| + struct {{config.protocol.export_macro}} {{property.name | to_title_case}}Enum {
|
| + {% for literal in property.enum %}
|
| + static const char* {{literal | dash_to_camelcase}};
|
| + {% endfor %}
|
| + }; // {{property.name | to_title_case}}Enum
|
| + {% endif %}
|
| +
|
| + {% if property.optional %}
|
| + bool has{{property.name | to_title_case}}() { return m_{{property.name}}.isJust(); }
|
| + {{resolve_type(property).raw_return_type}} get{{property.name | to_title_case}}({{resolve_type(property).raw_pass_type}} defaultValue) { return m_{{property.name}}.isJust() ? m_{{property.name}}.fromJust() : defaultValue; }
|
| + {% else %}
|
| + {{resolve_type(property).raw_return_type}} get{{property.name | to_title_case}}() { return {{resolve_type(property).to_raw_type % ("m_" + property.name)}}; }
|
| + {% endif %}
|
| + void set{{property.name | to_title_case}}({{resolve_type(property).pass_type}} value) { m_{{property.name}} = {{resolve_type(property).to_rvalue % "value"}}; }
|
| + {% endfor %}
|
| +
|
| + std::unique_ptr<protocol::DictionaryValue> serialize() const;
|
| + std::unique_ptr<{{type.id}}> clone() const;
|
| + {% if type.exported %}
|
| + {{config.exported.string_out}} toJSONString() const override;
|
| + {% endif %}
|
| +
|
| + template<int STATE>
|
| + class {{type.id}}Builder {
|
| + public:
|
| + enum {
|
| + NoFieldsSet = 0,
|
| + {% set count = 0 %}
|
| + {% for property in type.properties %}
|
| + {% if not(property.optional) %}
|
| + {% set count = count + 1 %}
|
| + {{property.name | to_title_case}}Set = 1 << {{count}},
|
| + {% endif %}
|
| + {% endfor %}
|
| + AllFieldsSet = (
|
| + {%- for property in type.properties %}
|
| + {% if not(property.optional) %}{{property.name | to_title_case}}Set | {%endif %}
|
| + {% endfor %}0)};
|
| +
|
| + {% for property in type.properties %}
|
| +
|
| + {% if property.optional %}
|
| + {{type.id}}Builder<STATE>& set{{property.name | to_title_case}}({{resolve_type(property).pass_type}} value)
|
| + {
|
| + m_result->set{{property.name | to_title_case}}({{resolve_type(property).to_rvalue % "value"}});
|
| + return *this;
|
| + }
|
| + {% else %}
|
| + {{type.id}}Builder<STATE | {{property.name | to_title_case}}Set>& set{{property.name | to_title_case}}({{resolve_type(property).pass_type}} value)
|
| + {
|
| + static_assert(!(STATE & {{property.name | to_title_case}}Set), "property {{property.name}} should not be set yet");
|
| + m_result->set{{property.name | to_title_case}}({{resolve_type(property).to_rvalue % "value"}});
|
| + return castState<{{property.name | to_title_case}}Set>();
|
| + }
|
| + {% endif %}
|
| + {% endfor %}
|
| +
|
| + std::unique_ptr<{{type.id}}> build()
|
| + {
|
| + static_assert(STATE == AllFieldsSet, "state should be AllFieldsSet");
|
| + return std::move(m_result);
|
| + }
|
| +
|
| + private:
|
| + friend class {{type.id}};
|
| + {{type.id}}Builder() : m_result(new {{type.id}}()) { }
|
| +
|
| + template<int STEP> {{type.id}}Builder<STATE | STEP>& castState()
|
| + {
|
| + return *reinterpret_cast<{{type.id}}Builder<STATE | STEP>*>(this);
|
| + }
|
| +
|
| + {{type_def.type}} m_result;
|
| + };
|
| +
|
| + static {{type.id}}Builder<0> create()
|
| + {
|
| + return {{type.id}}Builder<0>();
|
| + }
|
| +
|
| +private:
|
| + {{type.id}}()
|
| + {
|
| + {% for property in type.properties %}
|
| + {% if not(property.optional) and "default_value" in resolve_type(property) %}
|
| + m_{{property.name}} = {{resolve_type(property).default_value}};
|
| + {%endif %}
|
| + {% endfor %}
|
| + }
|
| +
|
| + {% for property in type.properties %}
|
| + {% if property.optional %}
|
| + Maybe<{{resolve_type(property).raw_type}}> m_{{property.name}};
|
| + {% else %}
|
| + {{resolve_type(property).type}} m_{{property.name}};
|
| + {% endif %}
|
| + {% endfor %}
|
| +};
|
| +
|
| + {% endfor %}
|
| +
|
| +// ------------- Backend interface.
|
| +
|
| +class {{config.protocol.export_macro}} Backend {
|
| +public:
|
| + virtual ~Backend() { }
|
| +
|
| + {% for command in domain.commands %}
|
| + {% if "redirect" in command %}{% continue %}{% endif %}
|
| + {% if ("handlers" in command) and not ("renderer" in command["handlers"]) %}{% continue %}{% endif %}
|
| + {% if "async" in command %}
|
| + class {{config.protocol.export_macro}} {{command.name | to_title_case}}Callback : public BackendCallback {
|
| + public:
|
| + virtual void sendSuccess(
|
| + {%- for parameter in command.returns -%}
|
| + {%- if "optional" in parameter -%}
|
| + const Maybe<{{resolve_type(parameter).raw_type}}>& {{parameter.name}}
|
| + {%- else -%}
|
| + {{resolve_type(parameter).pass_type}} {{parameter.name}}
|
| + {%- endif -%}
|
| + {%- if not loop.last -%}, {% endif -%}
|
| + {%- endfor -%}
|
| + ) = 0;
|
| + };
|
| + {% endif %}
|
| + virtual void {{command.name}}(
|
| + {%- if not("async" in command) -%}
|
| + ErrorString*
|
| + {%- endif -%}
|
| + {%- for parameter in command.parameters -%}
|
| + {%- if (not loop.first) or not("async" in command) -%}, {% endif -%}
|
| + {%- if "optional" in parameter -%}
|
| + const Maybe<{{resolve_type(parameter).raw_type}}>& in_{{parameter.name}}
|
| + {%- else -%}
|
| + {{resolve_type(parameter).pass_type}} in_{{parameter.name}}
|
| + {%- endif -%}
|
| + {%- endfor -%}
|
| + {%- if "async" in command -%}
|
| + {%- if command.parameters -%}, {% endif -%}
|
| + std::unique_ptr<{{command.name | to_title_case}}Callback> callback
|
| + {%- else -%}
|
| + {%- for parameter in command.returns -%}
|
| + {%- if "optional" in parameter -%}
|
| + , Maybe<{{resolve_type(parameter).raw_type}}>* out_{{parameter.name}}
|
| + {%- else -%}
|
| + , {{resolve_type(parameter).type}}* out_{{parameter.name}}
|
| + {%- endif -%}
|
| + {%- endfor -%}
|
| + {%- endif -%}
|
| + ) = 0;
|
| + {% endfor %}
|
| +
|
| + {% if not has_disable(domain.commands) %}
|
| + virtual void disable(ErrorString*) { }
|
| + {% endif %}
|
| +};
|
| +
|
| +// ------------- Frontend interface.
|
| +
|
| +class {{config.protocol.export_macro}} Frontend {
|
| +public:
|
| + Frontend(FrontendChannel* frontendChannel) : m_frontendChannel(frontendChannel) { }
|
| + {% for event in domain.events %}
|
| + {% if "handlers" in event and not ("renderer" in event["handlers"]) %}{% continue %}{% endif %}
|
| + void {{event.name}}(
|
| + {%- for parameter in event.parameters -%}
|
| + {%- if "optional" in parameter -%}
|
| + const Maybe<{{resolve_type(parameter).raw_type}}>& {{parameter.name}} = Maybe<{{resolve_type(parameter).raw_type}}>()
|
| + {%- else -%}
|
| + {{resolve_type(parameter).pass_type}} {{parameter.name}}
|
| + {%- endif -%}{%- if not loop.last -%}, {% endif -%}
|
| + {%- endfor -%}
|
| + );
|
| + {% endfor %}
|
| +
|
| + void flush();
|
| +private:
|
| + FrontendChannel* m_frontendChannel;
|
| +};
|
| +
|
| +// ------------- Dispatcher.
|
| +
|
| +class {{config.protocol.export_macro}} Dispatcher {
|
| +public:
|
| + static void wire(UberDispatcher*, Backend*);
|
| +
|
| +private:
|
| + Dispatcher() { }
|
| +};
|
| +
|
| +// ------------- Metainfo.
|
| +
|
| +class {{config.protocol.export_macro}} Metainfo {
|
| +public:
|
| + using BackendClass = Backend;
|
| + using FrontendClass = Frontend;
|
| + using DispatcherClass = Dispatcher;
|
| + static const char domainName[];
|
| + static const char commandPrefix[];
|
| + static const char version[];
|
| +};
|
| +
|
| +} // namespace {{domain.domain}}
|
| +{% for namespace in config.protocol.namespace %}
|
| +} // namespace {{namespace}}
|
| +{% endfor %}
|
| +
|
| +#endif // !defined({{"_".join(config.protocol.namespace)}}_{{domain.domain}}_h)
|
|
|