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