// Copyright (c) 2022 The Vulkano developers
// Licensed under the Apache License, Version 2.0
// <LICENSE-APACHE or
// https://www.apache.org/licenses/LICENSE-2.0> or the MIT
// license <LICENSE-MIT or https://opensource.org/licenses/MIT>,
// at your option. All files in the project carrying such
// notice may not be copied, modified, or distributed except
// according to those terms.

use super::{write_file, VkRegistryData};
use proc_macro2::{Literal, TokenStream};
use quote::quote;

pub fn write(vk_data: &VkRegistryData) {
    let version_output = version_output(vk_data.header_version);
    write_file(
        "version.rs",
        format!(
            "vk.xml header version {}.{}.{}",
            vk_data.header_version.0, vk_data.header_version.1, vk_data.header_version.2
        ),
        quote! {
            #version_output
        },
    );
}

fn version_output((major, minor, patch): (u16, u16, u16)) -> TokenStream {
    let major = Literal::u16_unsuffixed(major);
    let minor = Literal::u16_unsuffixed(minor);
    let patch = Literal::u16_unsuffixed(patch);

    quote! {
        impl Version {
            /// The highest Vulkan API version currently supported by Vulkano.
            ///
            /// It is allowed for applications that use Vulkano to make use of features from higher
            /// versions than this. However, Vulkano itself will not make use of those features and
            /// will not expose their APIs, so they must be accessed by other means.
            ///
            /// The `max_api_version` of an [`Instance`](crate::instance::Instance) equals
            /// `HEADER_VERSION` by default, which locks out features from newer versions. In order
            /// to enable the use of higher versions, the `max_api_version` must be overridden when
            /// creating an instance.
            pub const HEADER_VERSION: Version = Version {
                major: #major,
                minor: #minor,
                patch: #patch,
            };
        }
    }
}
