{#
 # Copyright 2017 The Cobalt Authors. 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}} The Cobalt Authors. 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_
