{%- from "enum.tmpl" import declare_enum -%}
{%- from "union.tmpl" import declare_union -%}
{%- from "struct.tmpl" import declare_struct -%}
{%- from "interface.tmpl" import declare_interface -%}

// Generated by //mojo/public/tools/bindings/generators/mojom_rust_generator.py
// from {{module.path}}

#![allow(non_camel_case_types)]
#![allow(non_snake_case)]
#![allow(non_upper_case_globals)]
{#- TODO(crbug.com/500058268): See if we can only add imports that are actually needed #}
#![allow(unused_imports)]

chromium::import! {
    "//mojo/public/rust/mojom_value_parser";
    "//mojo/public/rust/bindings";
    "//mojo/public/rust/system";
{% for imprt in imports %}
    "{{imprt.target}}" as {{imprt.alias}};
{%- endfor %}
}

use std::collections::HashMap;
use ordered_float::OrderedFloat;
use bindings::interface::{Registrar, ResponseSender};

use mojom_value_parser::*;

{% for enum in module.enums %}
{{ declare_enum(enum.name, enum) }}
{% endfor -%}

{# Comment for whitespace purposes #}
{% for struct in module.structs %}
{%- for enum in struct.enums %}
{{- declare_enum(struct.name ~ "_" ~ enum.name, enum) }}
{# Comment for whitespace purposes #}
{% endfor %}
{%- endfor -%}

{% for interface in module.interfaces %}
{%- for enum in interface.enums %}
{{- declare_enum(interface.name ~ "_" ~ enum.name, enum) }}
{# Comment for whitespace purposes #}
{% endfor %}
{%- endfor -%}

{% for union in module.unions %}
{{ declare_union(union.name, union) }}
{% endfor -%}

{% for struct in module.structs %}
{{ declare_struct(struct.name, struct, true) }}
{% endfor -%}

{% for interface in module.interfaces %}
{{ declare_interface(interface) }}
{%- endfor -%}

{% for traits in typemaps_to_include %}
#[path = r"{{traits.path}}"]
mod {{traits.name}};
pub use {{traits.name}}::*;
{% endfor %}