Skip to main content

sdl3_sys/
metadata.rs

1//! Metadata for SDL types and constants
2
3use core::ffi::{CStr, c_char, c_int};
4
5pub use crate::properties::SDL_PropertyType as PropertyType;
6
7/// Metadata for hint constants
8#[derive(Clone, Copy)]
9pub struct Hint {
10    pub module: &'static str,
11    pub name: &'static str,
12    pub short_name: &'static str,
13    pub value: *const c_char,
14    pub doc: Option<&'static str>,
15    pub available_since: Option<c_int>,
16}
17
18unsafe impl Send for Hint {}
19unsafe impl Sync for Hint {}
20
21impl Hint {
22    #[inline(always)]
23    pub const fn value_cstr(&self) -> &'static CStr {
24        unsafe { CStr::from_ptr(self.value) }
25    }
26
27    #[inline(always)]
28    pub const fn value_str(&self) -> &'static str {
29        match self.value_cstr().to_str() {
30            Ok(str) => str,
31            Err(_) => unreachable!(),
32        }
33    }
34}
35
36/// Metadata for property constants
37#[derive(Clone, Copy)]
38pub struct Property {
39    pub module: &'static str,
40    pub name: &'static str,
41    pub short_name: &'static str,
42    pub value: *const c_char,
43    pub ty: PropertyType,
44    pub doc: Option<&'static str>,
45    pub available_since: Option<c_int>,
46}
47
48unsafe impl Send for Property {}
49unsafe impl Sync for Property {}
50
51impl Property {
52    #[inline(always)]
53    pub const fn value_cstr(&self) -> &'static CStr {
54        unsafe { CStr::from_ptr(self.value) }
55    }
56
57    #[inline(always)]
58    pub const fn value_str(&self) -> &'static str {
59        match self.value_cstr().to_str() {
60            Ok(str) => str,
61            Err(_) => unreachable!(),
62        }
63    }
64}
65
66/// Access metadata for typed groups of constants (c enums, flags, etc)
67pub trait GroupMetadata: 'static + Sized {
68    /// Metadata for this group
69    const GROUP_METADATA: &'static Group;
70}
71
72#[non_exhaustive]
73#[derive(Clone, Copy, PartialEq, Eq)]
74pub enum GroupKind {
75    Enum,
76    Flags,
77    Id,
78    Lock,
79}
80
81/// Metadata for typed groups of constants (c enums, flags, etc)
82#[derive(Clone, Copy)]
83pub struct Group {
84    pub kind: GroupKind,
85    pub module: &'static str,
86    pub name: &'static str,
87    pub short_name: &'static str,
88    pub doc: Option<&'static str>,
89    pub values: &'static [GroupValue],
90    pub available_since: Option<c_int>,
91}
92
93/// Metadata for a single value in a group of constants
94#[derive(Clone, Copy)]
95pub struct GroupValue {
96    pub name: &'static str,
97    pub short_name: &'static str,
98    pub doc: Option<&'static str>,
99    pub available_since: Option<c_int>,
100}
101
102#[derive(Clone, Copy, PartialEq, Eq)]
103pub enum StructKind {
104    Struct,
105    Union,
106}
107
108/// Metadata for structs and unions
109#[derive(Clone, Copy)]
110pub struct Struct {
111    pub kind: StructKind,
112    pub module: &'static str,
113    pub name: &'static str,
114    pub doc: Option<&'static str>,
115    pub available_since: Option<c_int>,
116    pub fields: &'static [Field],
117}
118
119/// Metadata for fields of structs and unions
120#[derive(Clone, Copy)]
121pub struct Field {
122    pub name: &'static str,
123    pub doc: Option<&'static str>,
124    pub available_since: Option<c_int>,
125    pub ty: &'static str,
126}
127
128#[cfg(feature = "metadata")]
129mod generated;
130
131#[cfg(feature = "metadata")]
132#[allow(unused_imports)] // false positive
133pub use generated::*;