{#
 # Copyright 2017 Google Inc. All Rights Reserved.
 #
 # 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.
 #}
// Copyright {{today.year}} Google Inc. All Rights Reserved.
//
// 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.

// clang-format off

// This file has been auto-generated by {{code_generator}}. DO NOT MODIFY!
// Auto-generated from template: {{template_path}}

#ifndef GENERATED_TYPE_CONVERSION_H_
#define GENERATED_TYPE_CONVERSION_H_

#include "cobalt/script/exception_state.h"
#include "third_party/mozjs-45/js/src/jsapi.h"

// #includes for generated types.
{% for path in includes %}
#include "{{path}}"
{% endfor %}

namespace cobalt {
namespace script {
namespace mozjs {

{% for dictionary in dictionaries %}
// {{dictionary.fully_qualified_name}} -> JSValue
void ToJSValue(
    JSContext* context,
    const {{dictionary.fully_qualified_name}}& in_value,
    JS::MutableHandleValue out_value);

// JSValue -> {{dictionary.fully_qualified_name}}
void FromJSValue(
    JSContext* context,
    JS::HandleValue value,
    int conversion_flags,
    ExceptionState* exception_state,
    {{dictionary.fully_qualified_name}}* out_value);

{% endfor %}
{% for enum in enumerations %}
// {{enum.fully_qualified_name}} -> JSValue
void ToJSValue(
    JSContext* context,
    {{enum.fully_qualified_name}} in_value,
    JS::MutableHandleValue out_value);

// JSValue -> {{enum.fully_qualified_name}}
void FromJSValue(
    JSContext* context,
    JS::HandleValue value,
    int conversion_flags,
    ExceptionState* exception_state,
    {{enum.fully_qualified_name}}* out_value);

{% endfor %}
}  // namespace mozjs
}  // namespace script
}  // namespace cobalt

// #include this here so the conversion functions for generated types are
// visible refer to template types, such as sequence<T>.
#include "cobalt/script/mozjs-45/conversion_helpers.h"

#endif  // GENERATED_TYPE_CONVERSION_H_
