Skip to main content

vk_parse/
types.rs

1#![allow(non_snake_case)]
2
3#[cfg(feature = "serialize")]
4use serde::{Deserialize, Serialize};
5
6/// Errors from which parser cannot recover.
7#[derive(Debug)]
8#[non_exhaustive]
9pub enum FatalError {
10    MissingRegistryElement,
11    IoError(std::io::Error),
12}
13
14impl From<std::io::Error> for FatalError {
15    fn from(v: std::io::Error) -> FatalError {
16        FatalError::IoError(v)
17    }
18}
19
20/// Errors from which parser can recover. How much information will be missing
21/// in the resulting Registry depends on the type of error and situation in
22/// which it occurs. For example, unrecognized attribute will simply be skipped
23/// without affecting anything around it, while unrecognized element will have
24/// all of its contents skipped.
25#[derive(Debug, PartialEq, Eq)]
26#[non_exhaustive]
27pub enum Error {
28    UnexpectedElement {
29        xpath: String,
30        name: String,
31    },
32    UnexpectedAttribute {
33        xpath: String,
34        name: String,
35    }, // "Missing attribute '{}' on element '{}'."
36    UnexpectedAttributeValue {
37        xpath: String,
38        name: String,
39        value: String,
40    },
41    MissingElement {
42        xpath: String,
43        name: String,
44    },
45    MissingAttribute {
46        xpath: String,
47        name: String,
48    },
49    SchemaViolation {
50        xpath: String,
51        desc: String,
52    },
53    ParseIntError {
54        xpath: String,
55        text: String,
56        error: std::num::ParseIntError,
57    },
58    Internal {
59        desc: &'static str,
60    },
61}
62
63/// Rust structure representing the Vulkan registry.
64///
65/// The registry contains all the information contained in a certain version
66/// of the Vulkan specification, stored within a programmer-accessible format.
67#[derive(Debug, Clone, PartialEq, Eq, Default)]
68#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
69pub struct Registry(pub Vec<RegistryChild>);
70
71/// An element of the Vulkan registry.
72#[derive(Debug, Clone, PartialEq, Eq)]
73#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
74#[non_exhaustive]
75pub enum RegistryChild {
76    /// Comments are human-readable strings which contain registry meta-data.
77    Comment(String),
78
79    /// IDs of all known Vulkan vendors.
80    VendorIds(VendorIds),
81
82    /// List of supported Vulkan platforms.
83    Platforms(Platforms),
84
85    /// Known extension tags.
86    Tags(Tags),
87
88    /// Type definitions.
89    ///
90    /// Unlike OpenGL, Vulkan is a strongly-typed API.
91    Types(Types),
92
93    /// Enum definitions.
94    Enums(Enums),
95
96    /// Commands are the Vulkan API's name for functions.
97    Commands(Commands),
98
99    /// Feature level of the API, such as Vulkan 1.0 or 1.1
100    Feature(Feature),
101
102    /// Container for all published Vulkan specification extensions.
103    Extensions(Extensions),
104
105    Formats(Formats),
106
107    SpirvExtensions(SpirvExtensions),
108
109    SpirvCapabilities(SpirvCapabilities),
110
111    Sync(Sync),
112
113    VideoCodecs(VideoCodecs),
114
115    DynamicStates(DynamicStates),
116}
117
118pub type VendorIds = CommentedChildren<VendorId>;
119
120/// Unique identifier for a Vulkan vendor.
121///
122/// Note: in newer versions of the Vulkan spec (1.1.79 and later), this tag is
123/// not used, instead it has been replaced by the `VKVendorId` enum.
124#[derive(Debug, Clone, PartialEq, Eq, Default)]
125#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
126#[non_exhaustive]
127pub struct VendorId {
128    /// Name of the vendor.
129    pub name: String,
130
131    /// The unique ID.
132    pub id: u32,
133
134    /// Human-readable description.
135    #[cfg_attr(
136        feature = "serialize",
137        serde(default, skip_serializing_if = "is_default")
138    )]
139    pub comment: Option<String>,
140}
141
142pub type Platforms = CommentedChildren<Platform>;
143
144/// A platform refers to a windowing system which Vulkan can use.
145///
146/// Most operating systems will have only one corresponding platform,
147/// but Linux has multiple (XCB, Wayland, etc.)
148///
149/// Used in versions 1.1.70 and later.
150#[derive(Debug, Clone, PartialEq, Eq, Default)]
151#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
152#[non_exhaustive]
153pub struct Platform {
154    /// Short identifier.
155    pub name: String,
156
157    /// C macro name which is used to guard platform-specific definitions.
158    pub protect: String,
159
160    /// Human readable description of the platform.
161    #[cfg_attr(
162        feature = "serialize",
163        serde(default, skip_serializing_if = "is_default")
164    )]
165    pub comment: Option<String>,
166}
167
168pub type Tags = CommentedChildren<Tag>;
169
170/// Tags are the little suffixes attached to extension names or items, indicating the author.
171///
172/// Some examples:
173/// - KHR for Khronos extensions
174/// - EXT for multi-vendor extensions
175#[derive(Debug, Clone, PartialEq, Eq, Default)]
176#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
177#[non_exhaustive]
178pub struct Tag {
179    /// The name of the tag, e.g. "KHR".
180    pub name: String,
181    /// Author of the extensions associated with the tag, e.g. "Khronos".
182    pub author: String,
183    /// Contact information for the extension author(s).
184    pub contact: String,
185}
186
187pub type Types = CommentedChildren<TypesChild>;
188
189/// An item making up a type definition.
190#[derive(Debug, Clone, PartialEq, Eq)]
191#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
192#[non_exhaustive]
193pub enum TypesChild {
194    Type(Type),
195    Comment(String),
196}
197
198#[derive(Debug, Clone, PartialEq, Eq, Default)]
199#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
200#[non_exhaustive]
201pub struct Type {
202    #[cfg_attr(
203        feature = "serialize",
204        serde(default, skip_serializing_if = "is_default")
205    )]
206    pub name: Option<String>,
207
208    #[cfg_attr(
209        feature = "serialize",
210        serde(default, skip_serializing_if = "is_default")
211    )]
212    pub alias: Option<String>,
213
214    #[cfg_attr(
215        feature = "serialize",
216        serde(default, skip_serializing_if = "is_default")
217    )]
218    pub api: Option<String>,
219
220    #[cfg_attr(
221        feature = "serialize",
222        serde(default, skip_serializing_if = "is_default")
223    )]
224    pub requires: Option<String>,
225
226    #[cfg_attr(
227        feature = "serialize",
228        serde(default, skip_serializing_if = "is_default")
229    )]
230    pub category: Option<String>,
231
232    #[cfg_attr(
233        feature = "serialize",
234        serde(default, skip_serializing_if = "is_default")
235    )]
236    pub comment: Option<String>,
237
238    #[cfg_attr(
239        feature = "serialize",
240        serde(default, skip_serializing_if = "is_default")
241    )]
242    pub parent: Option<String>,
243
244    #[cfg_attr(
245        feature = "serialize",
246        serde(default, skip_serializing_if = "is_default")
247    )]
248    pub returnedonly: Option<String>,
249
250    #[cfg_attr(
251        feature = "serialize",
252        serde(default, skip_serializing_if = "is_default")
253    )]
254    pub structextends: Option<String>,
255
256    #[cfg_attr(
257        feature = "serialize",
258        serde(default, skip_serializing_if = "is_default")
259    )]
260    pub allowduplicate: Option<String>,
261
262    #[cfg_attr(
263        feature = "serialize",
264        serde(default, skip_serializing_if = "is_default")
265    )]
266    pub objtypeenum: Option<String>,
267
268    #[cfg_attr(
269        feature = "serialize",
270        serde(default, skip_serializing_if = "is_default")
271    )]
272    pub requiredlimittype: Option<String>,
273
274    #[cfg_attr(
275        feature = "serialize",
276        serde(default, skip_serializing_if = "is_default")
277    )]
278    pub bitvalues: Option<String>,
279
280    #[cfg_attr(
281        feature = "serialize",
282        serde(default, skip_serializing_if = "is_default")
283    )]
284    pub spec: TypeSpec,
285
286    #[cfg_attr(
287        feature = "serialize",
288        serde(default, skip_serializing_if = "is_default")
289    )]
290    pub deprecated: Option<String>,
291}
292
293/// The contents of a type definition.
294#[derive(Debug, Clone, PartialEq, Eq)]
295#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
296#[non_exhaustive]
297pub enum TypeSpec {
298    None,
299    Code(TypeCode),
300    Members(Vec<TypeMember>),
301    Funcpointer(FuncpointerCode),
302}
303
304impl Default for TypeSpec {
305    fn default() -> Self {
306        TypeSpec::None
307    }
308}
309
310#[derive(Debug, Clone, PartialEq, Eq, Default)]
311#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
312#[non_exhaustive]
313pub struct TypeCode {
314    pub code: String,
315
316    #[cfg_attr(
317        feature = "serialize",
318        serde(default, skip_serializing_if = "is_default")
319    )]
320    pub markup: Vec<TypeCodeMarkup>,
321}
322
323#[derive(Debug, Clone, PartialEq, Eq)]
324#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
325#[non_exhaustive]
326pub enum TypeCodeMarkup {
327    Name(String),
328    Type(String),
329    ApiEntry(String),
330}
331
332#[derive(Debug, Clone, PartialEq, Eq, Default)]
333#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
334#[non_exhaustive]
335pub struct FuncpointerCode {
336    // Compatibility with pre-1.4.339
337    pub code: String,
338
339    // Compatibility with pre-1.4.339
340    #[cfg_attr(
341        feature = "serialize",
342        serde(default, skip_serializing_if = "is_default")
343    )]
344    pub markup: Vec<TypeCodeMarkup>,
345
346    pub proto: FuncpointerProtoMarkup,
347
348    #[cfg_attr(
349        feature = "serialize",
350        serde(default, skip_serializing_if = "is_default")
351    )]
352    pub params: Vec<FuncpointerParamMarkup>,
353}
354
355pub type FuncpointerProtoMarkup = NameWithType;
356
357// According to schema, `param` can have a bunch of attributes not present on
358// proto. However, in current version of the xml, those are not used, so parsing
359// both into same type. User code should use these aliases to ensure
360// compatibility when they need to become distinct types. At that point, it might
361// become the same thing as CommandParam.
362pub type FuncpointerParamMarkup = NameWithType;
363
364/// A member of a type definition, i.e. a struct member.
365#[derive(Debug, Clone, PartialEq, Eq)]
366#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
367#[non_exhaustive]
368pub enum TypeMember {
369    /// Human-readable comment.
370    Comment(String),
371
372    /// A structure field definition.
373    Definition(TypeMemberDefinition),
374}
375
376#[derive(Debug, Clone, PartialEq, Eq, Default)]
377#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
378#[non_exhaustive]
379pub struct TypeMemberDefinition {
380    #[cfg_attr(
381        feature = "serialize",
382        serde(default, skip_serializing_if = "is_default")
383    )]
384    pub len: Option<String>,
385
386    #[cfg_attr(
387        feature = "serialize",
388        serde(default, skip_serializing_if = "is_default")
389    )]
390    pub altlen: Option<String>,
391
392    #[cfg_attr(
393        feature = "serialize",
394        serde(default, skip_serializing_if = "is_default")
395    )]
396    pub externsync: Option<String>,
397
398    #[cfg_attr(
399        feature = "serialize",
400        serde(default, skip_serializing_if = "is_default")
401    )]
402    pub optional: Option<String>,
403
404    #[cfg_attr(
405        feature = "serialize",
406        serde(default, skip_serializing_if = "is_default")
407    )]
408    pub selector: Option<String>,
409
410    #[cfg_attr(
411        feature = "serialize",
412        serde(default, skip_serializing_if = "is_default")
413    )]
414    pub selection: Option<String>,
415
416    #[cfg_attr(
417        feature = "serialize",
418        serde(default, skip_serializing_if = "is_default")
419    )]
420    pub noautovalidity: Option<String>,
421
422    #[cfg_attr(
423        feature = "serialize",
424        serde(default, skip_serializing_if = "is_default")
425    )]
426    pub validextensionstructs: Option<String>,
427
428    #[cfg_attr(
429        feature = "serialize",
430        serde(default, skip_serializing_if = "is_default")
431    )]
432    pub values: Option<String>,
433
434    #[cfg_attr(
435        feature = "serialize",
436        serde(default, skip_serializing_if = "is_default")
437    )]
438    pub limittype: Option<String>,
439
440    #[cfg_attr(
441        feature = "serialize",
442        serde(default, skip_serializing_if = "is_default")
443    )]
444    pub objecttype: Option<String>,
445
446    #[cfg_attr(
447        feature = "serialize",
448        serde(default, skip_serializing_if = "is_default")
449    )]
450    pub deprecated: Option<String>,
451
452    #[cfg_attr(
453        feature = "serialize",
454        serde(default, skip_serializing_if = "is_default")
455    )]
456    pub api: Option<String>,
457
458    #[cfg_attr(
459        feature = "serialize",
460        serde(default, skip_serializing_if = "is_default")
461    )]
462    pub code: String,
463
464    #[cfg_attr(
465        feature = "serialize",
466        serde(default, skip_serializing_if = "is_default")
467    )]
468    pub markup: Vec<TypeMemberMarkup>,
469
470    #[cfg_attr(
471        feature = "serialize",
472        serde(default, skip_serializing_if = "is_default")
473    )]
474    pub featurelink: Option<String>,
475
476    #[cfg_attr(
477        feature = "serialize",
478        serde(default, skip_serializing_if = "is_default")
479    )]
480    pub flagsextend: Option<String>,
481
482    #[cfg_attr(
483        feature = "serialize",
484        serde(default, skip_serializing_if = "is_default")
485    )]
486    pub flagsextendmember: Option<String>,
487}
488
489#[derive(Debug, Clone, PartialEq, Eq)]
490#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
491#[non_exhaustive]
492pub enum TypeMemberMarkup {
493    Name(String),
494    Type(String),
495    Enum(String),
496    Comment(String),
497}
498
499#[derive(Debug, Clone, PartialEq, Eq, Default)]
500#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
501#[non_exhaustive]
502pub struct Enums {
503    #[cfg_attr(
504        feature = "serialize",
505        serde(default, skip_serializing_if = "is_default")
506    )]
507    pub name: Option<String>,
508
509    #[cfg_attr(
510        feature = "serialize",
511        serde(default, skip_serializing_if = "is_default")
512    )]
513    pub kind: Option<String>,
514
515    #[cfg_attr(
516        feature = "serialize",
517        serde(default, skip_serializing_if = "is_default")
518    )]
519    pub start: Option<i64>,
520
521    #[cfg_attr(
522        feature = "serialize",
523        serde(default, skip_serializing_if = "is_default")
524    )]
525    pub end: Option<i64>,
526
527    #[cfg_attr(
528        feature = "serialize",
529        serde(default, skip_serializing_if = "is_default")
530    )]
531    pub vendor: Option<String>,
532
533    #[cfg_attr(
534        feature = "serialize",
535        serde(default, skip_serializing_if = "is_default")
536    )]
537    pub comment: Option<String>,
538
539    #[cfg_attr(
540        feature = "serialize",
541        serde(default, skip_serializing_if = "is_default")
542    )]
543    pub children: Vec<EnumsChild>,
544
545    #[cfg_attr(
546        feature = "serialize",
547        serde(default, skip_serializing_if = "is_default")
548    )]
549    pub bitwidth: Option<u32>,
550}
551
552/// An item which forms an enum.
553#[derive(Debug, Clone, PartialEq, Eq)]
554#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
555#[non_exhaustive]
556pub enum EnumsChild {
557    /// Actual named enum.
558    Enum(Enum),
559
560    /// An unused range of enum values.
561    Unused(Unused),
562
563    /// Human-readable comment.
564    Comment(String),
565}
566
567/// An unused range of enum values.
568#[derive(Debug, Clone, PartialEq, Eq, Default)]
569#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
570#[non_exhaustive]
571pub struct Unused {
572    /// Beginning of the range.
573    pub start: i64,
574
575    /// Ending value of the range, if any.
576    #[cfg_attr(
577        feature = "serialize",
578        serde(default, skip_serializing_if = "is_default")
579    )]
580    pub end: Option<i64>,
581
582    /// Vendor who reserved this range.
583    #[cfg_attr(
584        feature = "serialize",
585        serde(default, skip_serializing_if = "is_default")
586    )]
587    pub vendor: Option<String>,
588
589    /// Human-readable description.
590    #[cfg_attr(
591        feature = "serialize",
592        serde(default, skip_serializing_if = "is_default")
593    )]
594    pub comment: Option<String>,
595}
596
597/// An item of an enumeration type.
598#[derive(Debug, Clone, PartialEq, Eq, Default)]
599#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
600#[non_exhaustive]
601pub struct Enum {
602    /// Name of this enum.
603    pub name: String,
604
605    /// Human-readable description.
606    #[cfg_attr(
607        feature = "serialize",
608        serde(default, skip_serializing_if = "is_default")
609    )]
610    pub comment: Option<String>,
611
612    #[cfg_attr(
613        feature = "serialize",
614        serde(default, skip_serializing_if = "is_default")
615    )]
616    pub type_suffix: Option<String>,
617
618    #[cfg_attr(
619        feature = "serialize",
620        serde(default, skip_serializing_if = "is_default")
621    )]
622    pub api: Option<String>,
623
624    #[cfg_attr(
625        feature = "serialize",
626        serde(default, skip_serializing_if = "is_default")
627    )]
628    pub protect: Option<String>,
629
630    #[cfg_attr(
631        feature = "serialize",
632        serde(default, skip_serializing_if = "is_default")
633    )]
634    pub deprecated: Option<String>,
635
636    #[cfg_attr(
637        feature = "serialize",
638        serde(default, skip_serializing_if = "is_default")
639    )]
640    pub spec: EnumSpec,
641}
642
643/// An enum specifier, which assigns a value to the enum.
644#[derive(Debug, Clone, PartialEq, Eq)]
645#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
646#[non_exhaustive]
647pub enum EnumSpec {
648    None,
649
650    Alias {
651        alias: String,
652
653        #[cfg_attr(
654            feature = "serialize",
655            serde(default, skip_serializing_if = "is_default")
656        )]
657        extends: Option<String>,
658    },
659
660    Offset {
661        offset: i64,
662
663        #[cfg_attr(
664            feature = "serialize",
665            serde(default, skip_serializing_if = "is_default")
666        )]
667        extends: String,
668
669        #[cfg_attr(
670            feature = "serialize",
671            serde(default, skip_serializing_if = "is_default")
672        )]
673        extnumber: Option<i64>,
674
675        #[cfg_attr(
676            feature = "serialize",
677            serde(default, skip_serializing_if = "is_default")
678        )]
679        dir: bool,
680    },
681
682    /// Indicates an enum which is a bit flag.
683    Bitpos {
684        /// The bit to be set.
685        bitpos: i64,
686
687        /// Which structure this enum extends.
688        #[cfg_attr(
689            feature = "serialize",
690            serde(default, skip_serializing_if = "is_default")
691        )]
692        extends: Option<String>,
693    },
694
695    /// An enum value.
696    Value {
697        /// Hard coded value for an enum.
698        value: String, // rnc says this is an Integer, but validates it as text, and that's what it sometimes really is.
699
700        /// Which structure this enum extends.
701        #[cfg_attr(
702            feature = "serialize",
703            serde(default, skip_serializing_if = "is_default")
704        )]
705        extends: Option<String>,
706    },
707}
708
709impl Default for EnumSpec {
710    fn default() -> Self {
711        EnumSpec::None
712    }
713}
714
715pub type Commands = CommentedChildren<Command>;
716
717/// A command is just a Vulkan function.
718#[derive(Debug, Clone, PartialEq, Eq)]
719#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
720#[non_exhaustive]
721pub enum Command {
722    /// Indicates this function is an alias for another one.
723    Alias { name: String, alias: String },
724
725    /// Defines a new Vulkan function.
726    Definition(CommandDefinition),
727}
728
729#[derive(Debug, Clone, PartialEq, Eq, Default)]
730#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
731#[non_exhaustive]
732pub struct CommandDefinition {
733    #[cfg_attr(
734        feature = "serialize",
735        serde(default, skip_serializing_if = "is_default")
736    )]
737    pub tasks: Option<String>,
738
739    #[cfg_attr(
740        feature = "serialize",
741        serde(default, skip_serializing_if = "is_default")
742    )]
743    pub queues: Option<String>,
744
745    #[cfg_attr(
746        feature = "serialize",
747        serde(default, skip_serializing_if = "is_default")
748    )]
749    pub successcodes: Option<String>,
750
751    #[cfg_attr(
752        feature = "serialize",
753        serde(default, skip_serializing_if = "is_default")
754    )]
755    pub errorcodes: Option<String>,
756
757    #[cfg_attr(
758        feature = "serialize",
759        serde(default, skip_serializing_if = "is_default")
760    )]
761    pub renderpass: Option<String>,
762
763    #[cfg_attr(
764        feature = "serialize",
765        serde(default, skip_serializing_if = "is_default")
766    )]
767    pub videocoding: Option<String>,
768
769    #[cfg_attr(
770        feature = "serialize",
771        serde(default, skip_serializing_if = "is_default")
772    )]
773    pub conditionalrendering: Option<bool>,
774
775    #[cfg_attr(
776        feature = "serialize",
777        serde(default, skip_serializing_if = "is_default")
778    )]
779    pub cmdbufferlevel: Option<String>,
780
781    #[cfg_attr(
782        feature = "serialize",
783        serde(default, skip_serializing_if = "is_default")
784    )]
785    pub allownoqueues: Option<String>,
786
787    #[cfg_attr(
788        feature = "serialize",
789        serde(default, skip_serializing_if = "is_default")
790    )]
791    pub pipeline: Option<String>,
792
793    #[cfg_attr(
794        feature = "serialize",
795        serde(default, skip_serializing_if = "is_default")
796    )]
797    pub comment: Option<String>,
798
799    #[cfg_attr(
800        feature = "serialize",
801        serde(default, skip_serializing_if = "is_default")
802    )]
803    pub proto: NameWithType,
804
805    #[cfg_attr(
806        feature = "serialize",
807        serde(default, skip_serializing_if = "is_default")
808    )]
809    pub params: Vec<CommandParam>,
810
811    #[cfg_attr(
812        feature = "serialize",
813        serde(default, skip_serializing_if = "is_default")
814    )]
815    pub alias: Option<String>,
816
817    #[cfg_attr(
818        feature = "serialize",
819        serde(default, skip_serializing_if = "is_default")
820    )]
821    pub description: Option<String>,
822
823    #[cfg_attr(
824        feature = "serialize",
825        serde(default, skip_serializing_if = "is_default")
826    )]
827    pub implicitexternsyncparams: Vec<String>,
828
829    #[cfg_attr(
830        feature = "serialize",
831        serde(default, skip_serializing_if = "is_default")
832    )]
833    pub api: Option<String>,
834
835    #[cfg_attr(
836        feature = "serialize",
837        serde(default, skip_serializing_if = "is_default")
838    )]
839    pub export: Option<String>,
840
841    #[cfg_attr(
842        feature = "serialize",
843        serde(default, skip_serializing_if = "is_default")
844    )]
845    pub code: String,
846}
847
848/// Parameter for this Vulkan function.
849#[derive(Debug, Clone, PartialEq, Eq, Default)]
850#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
851#[non_exhaustive]
852pub struct CommandParam {
853    /// The expression which indicates the length of this array.
854    #[cfg_attr(
855        feature = "serialize",
856        serde(default, skip_serializing_if = "is_default")
857    )]
858    pub len: Option<String>,
859
860    /// Alternate description of the length of this parameter.
861    #[cfg_attr(
862        feature = "serialize",
863        serde(default, skip_serializing_if = "is_default")
864    )]
865    pub altlen: Option<String>,
866
867    /// Whether this parameter must be externally synchronised by the app.
868    #[cfg_attr(
869        feature = "serialize",
870        serde(default, skip_serializing_if = "is_default")
871    )]
872    pub externsync: Option<String>,
873
874    /// Whether this parameter must have a non-null value.
875    #[cfg_attr(
876        feature = "serialize",
877        serde(default, skip_serializing_if = "is_default")
878    )]
879    pub optional: Option<String>,
880
881    /// Disables automatic validity language being generated for this item.
882    #[cfg_attr(
883        feature = "serialize",
884        serde(default, skip_serializing_if = "is_default")
885    )]
886    pub noautovalidity: Option<String>,
887
888    #[cfg_attr(
889        feature = "serialize",
890        serde(default, skip_serializing_if = "is_default")
891    )]
892    pub objecttype: Option<String>,
893
894    /// The definition of this parameter.
895    #[cfg_attr(
896        feature = "serialize",
897        serde(default, skip_serializing_if = "is_default")
898    )]
899    pub definition: NameWithType,
900
901    /// only applicable for parameters which are pointers to `VkBaseInStructure` or
902    /// `VkBaseOutStructure` types, used as abstract placeholders. Specifies a list of structures
903    /// which may be passed in place of the parameter, or anywhere in the `pNext` chain of the
904    /// parameter.
905    #[cfg_attr(
906        feature = "serialize",
907        serde(default, skip_serializing_if = "is_default")
908    )]
909    pub validstructs: Vec<String>,
910
911    #[cfg_attr(
912        feature = "serialize",
913        serde(default, skip_serializing_if = "is_default")
914    )]
915    pub stride: Option<String>,
916
917    #[cfg_attr(
918        feature = "serialize",
919        serde(default, skip_serializing_if = "is_default")
920    )]
921    pub api: Option<String>,
922}
923
924#[derive(Debug, Clone, PartialEq, Eq, Default)]
925#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
926#[non_exhaustive]
927pub struct Feature {
928    #[cfg_attr(
929        feature = "serialize",
930        serde(default, skip_serializing_if = "is_default")
931    )]
932    pub api: String,
933
934    #[cfg_attr(
935        feature = "serialize",
936        serde(default, skip_serializing_if = "is_default")
937    )]
938    pub apitype: Option<String>,
939
940    #[cfg_attr(
941        feature = "serialize",
942        serde(default, skip_serializing_if = "is_default")
943    )]
944    pub name: String,
945
946    #[cfg_attr(
947        feature = "serialize",
948        serde(default, skip_serializing_if = "is_default")
949    )]
950    pub number: Option<String>,
951
952    #[cfg_attr(
953        feature = "serialize",
954        serde(default, skip_serializing_if = "is_default")
955    )]
956    pub depends: Option<String>,
957
958    #[cfg_attr(
959        feature = "serialize",
960        serde(default, skip_serializing_if = "is_default")
961    )]
962    pub protect: Option<String>,
963
964    #[cfg_attr(
965        feature = "serialize",
966        serde(default, skip_serializing_if = "is_default")
967    )]
968    pub comment: Option<String>,
969
970    #[cfg_attr(
971        feature = "serialize",
972        serde(default, skip_serializing_if = "is_default")
973    )]
974    pub children: Vec<FeatureChild>,
975}
976
977pub type FeatureChild = ExtensionChild;
978
979pub type Extensions = CommentedChildren<Extension>;
980
981#[derive(Debug, Clone, PartialEq, Eq, Default)]
982#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
983#[non_exhaustive]
984pub struct Extension {
985    /// Name of the extension.
986    pub name: String,
987
988    /// Human-readable description.
989    #[cfg_attr(
990        feature = "serialize",
991        serde(default, skip_serializing_if = "is_default")
992    )]
993    pub comment: Option<String>,
994
995    /// The unique index of this extension.
996    #[cfg_attr(
997        feature = "serialize",
998        serde(default, skip_serializing_if = "is_default")
999    )]
1000    pub number: Option<i64>,
1001
1002    #[cfg_attr(
1003        feature = "serialize",
1004        serde(default, skip_serializing_if = "is_default")
1005    )]
1006    pub protect: Option<String>,
1007
1008    /// Which platform it works with, if any.
1009    #[cfg_attr(
1010        feature = "serialize",
1011        serde(default, skip_serializing_if = "is_default")
1012    )]
1013    pub platform: Option<String>,
1014
1015    /// Tag name of the author.
1016    #[cfg_attr(
1017        feature = "serialize",
1018        serde(default, skip_serializing_if = "is_default")
1019    )]
1020    pub author: Option<String>,
1021
1022    /// Contact information for extension author(s).
1023    #[cfg_attr(
1024        feature = "serialize",
1025        serde(default, skip_serializing_if = "is_default")
1026    )]
1027    pub contact: Option<String>,
1028
1029    /// The level at which the extension applies (instance / device).
1030    #[cfg_attr(
1031        feature = "serialize",
1032        serde(default, skip_serializing_if = "is_default")
1033    )]
1034    pub ext_type: Option<String>,
1035
1036    #[cfg_attr(
1037        feature = "serialize",
1038        serde(default, skip_serializing_if = "is_default")
1039    )]
1040    pub requires: Option<String>,
1041
1042    #[cfg_attr(
1043        feature = "serialize",
1044        serde(default, skip_serializing_if = "is_default")
1045    )]
1046    pub requires_core: Option<String>,
1047
1048    #[cfg_attr(
1049        feature = "serialize",
1050        serde(default, skip_serializing_if = "is_default")
1051    )]
1052    pub supported: Option<String>, // mk:TODO StringGroup?
1053
1054    #[cfg_attr(
1055        feature = "serialize",
1056        serde(default, skip_serializing_if = "is_default")
1057    )]
1058    pub ratified: Option<String>,
1059
1060    #[cfg_attr(
1061        feature = "serialize",
1062        serde(default, skip_serializing_if = "is_default")
1063    )]
1064    pub deprecatedby: Option<String>,
1065
1066    /// Whether this extension was promoted to core, and in which version.
1067    #[cfg_attr(
1068        feature = "serialize",
1069        serde(default, skip_serializing_if = "is_default")
1070    )]
1071    pub promotedto: Option<String>,
1072
1073    #[cfg_attr(
1074        feature = "serialize",
1075        serde(default, skip_serializing_if = "is_default")
1076    )]
1077    pub obsoletedby: Option<String>,
1078
1079    /// 'true' if this extension is released provisionally
1080    #[cfg_attr(
1081        feature = "serialize",
1082        serde(default, skip_serializing_if = "is_default")
1083    )]
1084    pub provisional: bool,
1085
1086    /// The items which make up this extension.
1087    #[cfg_attr(
1088        feature = "serialize",
1089        serde(default, skip_serializing_if = "is_default")
1090    )]
1091    pub specialuse: Option<String>,
1092
1093    /// Relative sortorder
1094    #[cfg_attr(
1095        feature = "serialize",
1096        serde(default, skip_serializing_if = "is_default")
1097    )]
1098    pub sortorder: Option<i64>,
1099
1100    #[cfg_attr(
1101        feature = "serialize",
1102        serde(default, skip_serializing_if = "is_default")
1103    )]
1104    pub depends: Option<String>,
1105
1106    #[cfg_attr(
1107        feature = "serialize",
1108        serde(default, skip_serializing_if = "is_default")
1109    )]
1110    pub nofeatures: bool,
1111
1112    /// The items which make up this extension.
1113    #[cfg_attr(
1114        feature = "serialize",
1115        serde(default, skip_serializing_if = "is_default")
1116    )]
1117    pub children: Vec<ExtensionChild>,
1118}
1119
1120/// A part of an extension declaration.
1121///
1122/// Extensions either include functionality from the spec, or remove some functionality.
1123#[derive(Debug, Clone, PartialEq, Eq)]
1124#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
1125#[non_exhaustive]
1126pub enum ExtensionChild {
1127    /// Indicates the items which this extension requires to work.
1128    Require {
1129        #[cfg_attr(
1130            feature = "serialize",
1131            serde(default, skip_serializing_if = "is_default")
1132        )]
1133        api: Option<String>,
1134
1135        #[cfg_attr(
1136            feature = "serialize",
1137            serde(default, skip_serializing_if = "is_default")
1138        )]
1139        profile: Option<String>,
1140
1141        /// The extension which provides these required items, if any.
1142        #[cfg_attr(
1143            feature = "serialize",
1144            serde(default, skip_serializing_if = "is_default")
1145        )]
1146        extension: Option<String>,
1147
1148        #[cfg_attr(
1149            feature = "serialize",
1150            serde(default, skip_serializing_if = "is_default")
1151        )]
1152        feature: Option<String>,
1153
1154        #[cfg_attr(
1155            feature = "serialize",
1156            serde(default, skip_serializing_if = "is_default")
1157        )]
1158        comment: Option<String>,
1159
1160        #[cfg_attr(
1161            feature = "serialize",
1162            serde(default, skip_serializing_if = "is_default")
1163        )]
1164        depends: Option<String>,
1165
1166        /// The items which form this require block.
1167        items: Vec<InterfaceItem>,
1168    },
1169
1170    Deprecate {
1171        #[cfg_attr(
1172            feature = "serialize",
1173            serde(default, skip_serializing_if = "is_default")
1174        )]
1175        api: Option<String>,
1176
1177        #[cfg_attr(
1178            feature = "serialize",
1179            serde(default, skip_serializing_if = "is_default")
1180        )]
1181        profile: Option<String>,
1182
1183        #[cfg_attr(
1184            feature = "serialize",
1185            serde(default, skip_serializing_if = "is_default")
1186        )]
1187        comment: Option<String>,
1188
1189        #[cfg_attr(
1190            feature = "serialize",
1191            serde(default, skip_serializing_if = "is_default")
1192        )]
1193        explanationlink: String,
1194
1195        items: Vec<InterfaceItem>,
1196    },
1197
1198    /// Indicates the items this extension removes.
1199    Remove {
1200        #[cfg_attr(
1201            feature = "serialize",
1202            serde(default, skip_serializing_if = "is_default")
1203        )]
1204        api: Option<String>,
1205
1206        #[cfg_attr(
1207            feature = "serialize",
1208            serde(default, skip_serializing_if = "is_default")
1209        )]
1210        profile: Option<String>,
1211
1212        #[cfg_attr(
1213            feature = "serialize",
1214            serde(default, skip_serializing_if = "is_default")
1215        )]
1216        comment: Option<String>,
1217
1218        #[cfg_attr(
1219            feature = "serialize",
1220            serde(default, skip_serializing_if = "is_default")
1221        )]
1222        reasonlink: Option<String>,
1223
1224        #[cfg_attr(
1225            feature = "serialize",
1226            serde(default, skip_serializing_if = "is_default")
1227        )]
1228        items: Vec<InterfaceItem>,
1229    },
1230}
1231
1232/// An interface item is a function or an enum which makes up a Vulkan interface.
1233///
1234/// This structure is used by extensions to express dependencies or include functionality.
1235#[derive(Debug, Clone, PartialEq, Eq)]
1236#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
1237#[non_exhaustive]
1238pub enum InterfaceItem {
1239    Comment(String),
1240
1241    Type {
1242        name: String,
1243
1244        #[cfg_attr(
1245            feature = "serialize",
1246            serde(default, skip_serializing_if = "is_default")
1247        )]
1248        comment: Option<String>,
1249
1250        #[cfg_attr(
1251            feature = "serialize",
1252            serde(default, skip_serializing_if = "is_default")
1253        )]
1254        supersededby: Option<String>,
1255    },
1256
1257    Enum(Enum),
1258
1259    Command {
1260        name: String,
1261
1262        #[cfg_attr(
1263            feature = "serialize",
1264            serde(default, skip_serializing_if = "is_default")
1265        )]
1266        comment: Option<String>,
1267
1268        #[cfg_attr(
1269            feature = "serialize",
1270            serde(default, skip_serializing_if = "is_default")
1271        )]
1272        supersededby: Option<String>,
1273    },
1274
1275    Feature {
1276        name: String,
1277
1278        struct_: String,
1279
1280        #[cfg_attr(
1281            feature = "serialize",
1282            serde(default, skip_serializing_if = "is_default")
1283        )]
1284        comment: Option<String>,
1285    },
1286}
1287
1288pub type Formats = CommentedChildren<Format>;
1289
1290#[derive(Debug, Clone, PartialEq, Eq, Default)]
1291#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
1292#[non_exhaustive]
1293pub struct Format {
1294    pub name: String,
1295    pub class: String,
1296    pub blockSize: u8,
1297    pub texelsPerBlock: u8,
1298
1299    #[cfg_attr(
1300        feature = "serialize",
1301        serde(default, skip_serializing_if = "is_default")
1302    )]
1303    pub blockExtent: Option<String>,
1304
1305    #[cfg_attr(
1306        feature = "serialize",
1307        serde(default, skip_serializing_if = "is_default")
1308    )]
1309    pub packed: Option<u8>,
1310
1311    #[cfg_attr(
1312        feature = "serialize",
1313        serde(default, skip_serializing_if = "is_default")
1314    )]
1315    pub compressed: Option<String>,
1316
1317    #[cfg_attr(
1318        feature = "serialize",
1319        serde(default, skip_serializing_if = "is_default")
1320    )]
1321    pub chroma: Option<String>,
1322
1323    pub children: Vec<FormatChild>,
1324}
1325
1326#[derive(Debug, Clone, PartialEq, Eq)]
1327#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
1328#[non_exhaustive]
1329pub enum FormatChild {
1330    #[non_exhaustive]
1331    Component {
1332        name: String,
1333        bits: String,
1334        numericFormat: String,
1335        #[cfg_attr(
1336            feature = "serialize",
1337            serde(default, skip_serializing_if = "is_default")
1338        )]
1339        planeIndex: Option<u8>,
1340    },
1341
1342    #[non_exhaustive]
1343    Plane {
1344        index: u8,
1345        widthDivisor: u8,
1346        heightDivisor: u8,
1347        compatible: String,
1348    },
1349
1350    #[non_exhaustive]
1351    SpirvImageFormat { name: String },
1352}
1353
1354#[derive(Debug, Clone, PartialEq, Eq)]
1355#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
1356pub struct DynamicState {
1357    pub name: String,
1358    pub shaderstage: String,
1359    pub pipelinesubstate: Option<String>,
1360    pub requiresrasterization: Option<String>,
1361    pub children: Vec<DynamicStateChild>,
1362}
1363
1364pub type DynamicStates = Vec<DynamicState>;
1365
1366#[derive(Debug, Clone, PartialEq, Eq)]
1367#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
1368pub enum DynamicStateChild {
1369    DynamicStateCmd(DynamicStateCmd),
1370    Enable(Enable),
1371    StateCondition(StateCondition),
1372}
1373
1374#[derive(Debug, Clone, PartialEq, Eq)]
1375#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
1376pub struct DynamicStateCmd {
1377    pub name: String,
1378    pub pipeline: String,
1379    pub pipelineonly: Option<String>,
1380}
1381
1382#[derive(Debug, Clone, PartialEq, Eq)]
1383#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
1384pub struct StateCondition {
1385    pub state: Option<String>,
1386    pub special: Option<String>,
1387}
1388
1389#[derive(Debug, Clone, PartialEq, Eq, Default)]
1390#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
1391#[non_exhaustive]
1392pub struct NameWithType {
1393    #[cfg_attr(
1394        feature = "serialize",
1395        serde(default, skip_serializing_if = "is_default")
1396    )]
1397    pub type_name: Option<String>,
1398
1399    #[cfg_attr(
1400        feature = "serialize",
1401        serde(default, skip_serializing_if = "is_default")
1402    )]
1403    pub name: String,
1404
1405    #[cfg_attr(
1406        feature = "serialize",
1407        serde(default, skip_serializing_if = "is_default")
1408    )]
1409    pub code: String,
1410}
1411
1412#[derive(Debug, Clone, PartialEq, Eq, Default)]
1413#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
1414#[non_exhaustive]
1415pub struct CommentedChildren<T> {
1416    #[cfg_attr(
1417        feature = "serialize",
1418        serde(default, skip_serializing_if = "is_default")
1419    )]
1420    pub comment: Option<String>,
1421
1422    pub children: Vec<T>,
1423}
1424
1425#[derive(Debug, Clone, PartialEq, Eq, Default)]
1426#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
1427#[non_exhaustive]
1428pub struct SpirvExtOrCap {
1429    #[cfg_attr(
1430        feature = "serialize",
1431        serde(default, skip_serializing_if = "is_default")
1432    )]
1433    pub name: String,
1434
1435    #[cfg_attr(
1436        feature = "serialize",
1437        serde(default, skip_serializing_if = "is_default")
1438    )]
1439    pub enables: Vec<Enable>,
1440}
1441
1442pub type SpirvExtension = SpirvExtOrCap;
1443pub type SpirvExtensions = CommentedChildren<SpirvExtension>;
1444
1445pub type SpirvCapability = SpirvExtOrCap;
1446pub type SpirvCapabilities = CommentedChildren<SpirvCapability>;
1447
1448#[derive(Debug, Clone, PartialEq, Eq)]
1449#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
1450#[non_exhaustive]
1451pub enum SyncChild {
1452    Stage(SyncStage),
1453    Access(SyncAccess),
1454    Pipeline(SyncPipeline),
1455}
1456
1457pub type Sync = CommentedChildren<SyncChild>;
1458
1459#[derive(Debug, Clone, PartialEq, Eq, Default)]
1460#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
1461#[non_exhaustive]
1462pub struct SyncSupport {
1463    pub queues: Option<String>,
1464    pub stage: Option<String>,
1465}
1466
1467#[derive(Debug, Clone, PartialEq, Eq, Default)]
1468#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
1469#[non_exhaustive]
1470pub struct SyncEquivalent {
1471    pub stage: Option<String>,
1472    pub access: Option<String>,
1473}
1474
1475#[derive(Debug, Clone, PartialEq, Eq, Default)]
1476#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
1477#[non_exhaustive]
1478pub struct SyncStage {
1479    pub name: String,
1480    pub alias: Option<String>,
1481    pub syncsupport: Option<SyncSupport>,
1482    pub syncequivalent: Option<SyncEquivalent>,
1483}
1484
1485#[derive(Debug, Clone, PartialEq, Eq, Default)]
1486#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
1487#[non_exhaustive]
1488pub struct SyncAccess {
1489    pub name: String,
1490    pub alias: Option<String>,
1491    pub comment: Option<String>,
1492    pub syncsupport: Option<SyncSupport>,
1493    pub syncequivalent: Option<SyncEquivalent>,
1494}
1495
1496#[derive(Debug, Clone, PartialEq, Eq, Default)]
1497#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
1498#[non_exhaustive]
1499pub struct SyncPipeline {
1500    pub name: String,
1501    pub depends: Option<String>,
1502    pub children: Vec<SyncPipelineStage>,
1503}
1504
1505#[derive(Debug, Clone, PartialEq, Eq, Default)]
1506#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
1507#[non_exhaustive]
1508pub struct SyncPipelineStage {
1509    pub order: Option<String>,
1510    pub before: Option<String>,
1511    pub after: Option<String>,
1512    pub text: String,
1513}
1514
1515pub type VideoCodecs = CommentedChildren<VideoCodec>;
1516
1517#[derive(Debug, Clone, PartialEq, Eq, Default)]
1518#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
1519#[non_exhaustive]
1520pub struct VideoCodec {
1521    pub comment: Option<String>,
1522    pub name: String,
1523    pub extend: Option<String>,
1524    pub value: Option<String>,
1525    pub children: Vec<VideoCodecChild>,
1526}
1527
1528#[derive(Debug, Clone, PartialEq, Eq)]
1529#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
1530#[non_exhaustive]
1531pub enum VideoCodecChild {
1532    Profiles(VideoProfiles),
1533    Capabilities(VideoCapabilities),
1534    Format(VideoFormat),
1535}
1536
1537#[derive(Debug, Clone, PartialEq, Eq, Default)]
1538#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
1539#[non_exhaustive]
1540pub struct VideoProfiles {
1541    pub comment: Option<String>,
1542    pub struct_: String,
1543    pub children: Vec<VideoProfileMember>,
1544}
1545
1546#[derive(Debug, Clone, PartialEq, Eq, Default)]
1547#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
1548#[non_exhaustive]
1549pub struct VideoProfileMember {
1550    pub comment: Option<String>,
1551    pub name: String,
1552    pub children: Vec<VideoProfile>,
1553}
1554
1555#[derive(Debug, Clone, PartialEq, Eq, Default)]
1556#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
1557#[non_exhaustive]
1558pub struct VideoProfile {
1559    pub comment: Option<String>,
1560    pub name: String,
1561    pub value: String,
1562}
1563
1564#[derive(Debug, Clone, PartialEq, Eq, Default)]
1565#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
1566#[non_exhaustive]
1567pub struct VideoCapabilities {
1568    pub comment: Option<String>,
1569    pub struct_: String,
1570}
1571
1572#[derive(Debug, Clone, PartialEq, Eq, Default)]
1573#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
1574#[non_exhaustive]
1575pub struct VideoFormat {
1576    pub comment: Option<String>,
1577    pub name: Option<String>,
1578    pub usage: Option<String>,
1579    pub extend: Option<String>,
1580    pub children: Vec<VideoFormatChild>,
1581}
1582
1583#[derive(Debug, Clone, PartialEq, Eq)]
1584#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
1585#[non_exhaustive]
1586pub enum VideoFormatChild {
1587    RequireCapabilities(VideoRequireCapabilities),
1588    FormatProperties(VideoFormatProperties),
1589}
1590
1591#[derive(Debug, Clone, PartialEq, Eq, Default)]
1592#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
1593#[non_exhaustive]
1594pub struct VideoFormatProperties {
1595    pub comment: Option<String>,
1596    pub struct_: String,
1597}
1598
1599#[derive(Debug, Clone, PartialEq, Eq, Default)]
1600#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
1601#[non_exhaustive]
1602pub struct VideoRequireCapabilities {
1603    pub comment: Option<String>,
1604    pub struct_: String,
1605    pub member: String,
1606    pub value: String,
1607}
1608
1609#[derive(Debug, Clone, PartialEq, Eq)]
1610#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
1611#[non_exhaustive]
1612pub enum Enable {
1613    Version(String),
1614    Extension(String),
1615    Feature(FeatureEnable),
1616    Property(PropertyEnable),
1617}
1618
1619#[derive(Debug, Clone, PartialEq, Eq, Default)]
1620#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
1621#[non_exhaustive]
1622pub struct FeatureEnable {
1623    #[cfg_attr(
1624        feature = "serialize",
1625        serde(default, skip_serializing_if = "is_default")
1626    )]
1627    pub struct_: String,
1628
1629    #[cfg_attr(
1630        feature = "serialize",
1631        serde(default, skip_serializing_if = "is_default")
1632    )]
1633    pub feature: String,
1634
1635    #[cfg_attr(
1636        feature = "serialize",
1637        serde(default, skip_serializing_if = "is_default")
1638    )]
1639    pub requires: Option<String>,
1640
1641    #[cfg_attr(
1642        feature = "serialize",
1643        serde(default, skip_serializing_if = "is_default")
1644    )]
1645    pub alias: Option<String>,
1646}
1647
1648#[derive(Debug, Clone, PartialEq, Eq, Default)]
1649#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
1650#[non_exhaustive]
1651pub struct PropertyEnable {
1652    #[cfg_attr(
1653        feature = "serialize",
1654        serde(default, skip_serializing_if = "is_default")
1655    )]
1656    pub property: String,
1657
1658    #[cfg_attr(
1659        feature = "serialize",
1660        serde(default, skip_serializing_if = "is_default")
1661    )]
1662    pub member: String,
1663
1664    #[cfg_attr(
1665        feature = "serialize",
1666        serde(default, skip_serializing_if = "is_default")
1667    )]
1668    pub value: String,
1669
1670    #[cfg_attr(
1671        feature = "serialize",
1672        serde(default, skip_serializing_if = "is_default")
1673    )]
1674    pub requires: Option<String>,
1675}
1676
1677#[cfg(feature = "serialize")]
1678fn is_default<T: Default + Eq>(v: &T) -> bool {
1679    v.eq(&T::default())
1680}