{#
 # 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 "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_
