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