{#
 # 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 "v8/include/v8.h"

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

namespace cobalt {
namespace script {
namespace v8c {

{% for dictionary in dictionaries %}
// {{dictionary.fully_qualified_name}} -> JSValue
void ToJSValue(
    v8::Isolate* isolate,
    const {{dictionary.fully_qualified_name}}& in_value,
    v8::Local<v8::Value>* out_value);

// JSValue -> {{dictionary.fully_qualified_name}}
void FromJSValue(
    v8::Isolate* isolate,
    v8::Local<v8::Value> 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(
    v8::Isolate* isolate,
    {{enum.fully_qualified_name}} in_value,
    v8::Local<v8::Value>* out_value);

// JSValue -> {{enum.fully_qualified_name}}
void FromJSValue(
    v8::Isolate* isolate,
    v8::Local<v8::Value> value,
    int conversion_flags,
    ExceptionState* exception_state,
    {{enum.fully_qualified_name}}* out_value);
{% endfor %}

}  // namespace v8c
}  // 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/v8c/conversion_helpers.h"

#endif  // GENERATED_TYPE_CONVERSION_H_
