use indexmap::IndexMap;
use serde::Serialize;
#[derive(Debug, Serialize)]
pub struct FeatureSet {
pub spec_name: String,
pub display_name: String,
pub apis: Vec<String>,
pub is_merged: bool,
pub is_vulkan: bool,
pub is_gl_family: bool,
pub context_name: String,
pub features: Vec<Feature>,
pub extensions: Vec<Extension>,
pub commands: Vec<Command>,
pub types: Vec<TypeDef>,
pub flat_enums: Vec<FlatEnum>,
pub enum_groups: Vec<EnumGroup>,
pub feature_pfn_ranges: Vec<PfnRange>,
pub ext_pfn_ranges: IndexMap<String, Vec<PfnRange>>,
pub ext_subset_indices: IndexMap<String, Vec<u16>>,
pub alias_pairs: Vec<AliasPair>,
pub required_headers: Vec<String>,
pub excluded_explicit: Vec<String>,
pub excluded_baseline: Vec<String>,
pub include_type_groups: Vec<ProtectedGroup<TypeDef>>,
pub type_groups: Vec<ProtectedGroup<TypeDef>>,
pub ext_guard_groups: Vec<ProtectedGroup<ExtGuardEntry>>,
pub cmd_pfn_groups: Vec<ProtectedGroup<CmdPfnEntry>>,
pub flat_enum_groups: Vec<ProtectedGroup<FlatEnum>>,
}
#[derive(Debug, Serialize)]
pub struct Feature {
pub index: u16,
pub short_name: String,
pub full_name: String,
pub version: SerVersion,
pub packed: u16,
pub api: String,
}
#[derive(Debug, Serialize)]
pub struct SerVersion {
pub major: u32,
pub minor: u32,
}
#[derive(Debug, Serialize)]
pub struct Extension {
pub index: u16,
pub name: String,
pub short_name: String,
pub hash: String,
pub protect: Vec<String>,
pub reason: SelectionReason,
}
#[derive(Debug, Serialize)]
pub struct Command {
pub index: u16,
pub name: String,
pub short_name: String,
pub pfn_type: String,
pub return_type: String,
pub params_str: String,
pub params: Vec<Param>,
pub scope: String,
pub protect: Option<String>,
pub name_offset: u32,
}
#[derive(Debug, Clone, Serialize)]
pub struct Param {
pub type_raw: String,
pub name: String,
}
#[derive(Debug, Clone, Serialize)]
pub struct TypeDef {
pub name: String,
pub raw_c: String,
pub category: String,
pub protect: Vec<String>,
}
#[derive(Debug, Clone, Serialize)]
pub struct FlatEnum {
pub name: String,
pub value: String,
pub literal_value: String,
pub comment: String,
pub protect: Vec<String>,
}
#[derive(Debug, Serialize)]
pub struct EnumGroup {
pub name: String,
pub is_bitmask: bool,
pub bitwidth: u32,
pub values: Vec<FlatEnum>,
}
#[derive(Debug, Serialize, Clone, Copy, PartialEq, Eq)]
pub struct PfnRange {
pub extension: u16,
pub start: u16,
pub count: u16,
}
#[derive(Debug, Serialize)]
pub struct AliasPair {
pub canonical: u16,
pub secondary: u16,
}
#[derive(Debug, Serialize)]
pub struct ProtectedGroup<T: std::fmt::Debug + Serialize> {
pub protect: Vec<String>,
pub items: Vec<T>,
}
#[derive(Debug, Serialize)]
pub struct ExtGuardEntry {
pub name: String,
pub short_name: String,
}
#[derive(Debug, Serialize)]
pub struct CmdPfnEntry {
pub index: u16,
pub name: String,
pub short_name: String,
pub pfn_type: String,
pub return_type: String,
pub params_str: String,
pub params: Vec<Param>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize)]
pub enum SelectionReason {
Explicit,
AllExtensions,
Mandatory,
Dependency,
Promoted,
Predecessor,
}