wayland_scanner/
protocol.rs

1use proc_macro2::TokenStream;
2use quote::quote;
3
4#[derive(Clone, Debug)]
5pub struct Protocol {
6    pub name: String,
7    pub copyright: Option<String>,
8    pub description: Option<(String, String)>,
9    pub interfaces: Vec<Interface>,
10}
11
12impl Protocol {
13    pub fn new(name: String) -> Protocol {
14        Protocol { name, copyright: None, description: None, interfaces: Vec::new() }
15    }
16}
17
18#[derive(Clone, Debug)]
19pub struct Interface {
20    pub name: String,
21    pub version: u32,
22    pub description: Option<(String, String)>,
23    pub requests: Vec<Message>,
24    pub events: Vec<Message>,
25    pub enums: Vec<Enum>,
26}
27
28impl Interface {
29    pub fn new() -> Interface {
30        Interface {
31            name: String::new(),
32            version: 1,
33            description: None,
34            requests: Vec::new(),
35            events: Vec::new(),
36            enums: Vec::new(),
37        }
38    }
39}
40
41#[derive(Clone, Debug)]
42pub struct Message {
43    pub name: String,
44    pub typ: Option<Type>,
45    pub since: u32,
46    pub description: Option<(String, String)>,
47    pub args: Vec<Arg>,
48}
49
50impl Message {
51    pub fn new() -> Message {
52        Message { name: String::new(), typ: None, since: 1, description: None, args: Vec::new() }
53    }
54
55    pub fn all_null(&self) -> bool {
56        self.args
57            .iter()
58            .all(|a| !((a.typ == Type::Object || a.typ == Type::NewId) && a.interface.is_some()))
59    }
60}
61
62#[derive(Clone, Debug)]
63pub struct Arg {
64    pub name: String,
65    pub typ: Type,
66    pub interface: Option<String>,
67    pub summary: Option<String>,
68    pub description: Option<(String, String)>,
69    pub allow_null: bool,
70    pub enum_: Option<String>,
71}
72
73impl Arg {
74    pub fn new() -> Arg {
75        Arg {
76            name: String::new(),
77            typ: Type::Object,
78            interface: None,
79            summary: None,
80            description: None,
81            allow_null: false,
82            enum_: None,
83        }
84    }
85}
86
87#[derive(Clone, Debug)]
88pub struct Enum {
89    pub name: String,
90    pub since: u16,
91    pub description: Option<(String, String)>,
92    pub entries: Vec<Entry>,
93    pub bitfield: bool,
94}
95
96impl Enum {
97    pub fn new() -> Enum {
98        Enum {
99            name: String::new(),
100            since: 1,
101            description: None,
102            entries: Vec::new(),
103            bitfield: false,
104        }
105    }
106}
107
108#[derive(Clone, Debug)]
109pub struct Entry {
110    pub name: String,
111    pub value: u32,
112    pub since: u16,
113    pub description: Option<(String, String)>,
114    pub summary: Option<String>,
115}
116
117impl Entry {
118    pub fn new() -> Entry {
119        Entry { name: String::new(), value: 0, since: 1, description: None, summary: None }
120    }
121}
122
123#[derive(Debug, PartialEq, Eq, Copy, Clone)]
124pub enum Type {
125    Int,
126    Uint,
127    Fixed,
128    String,
129    Object,
130    NewId,
131    Array,
132    Fd,
133    Destructor,
134}
135
136impl Type {
137    pub fn nullable(self) -> bool {
138        matches!(self, Type::String | Type::Object)
139    }
140
141    pub fn common_type(self) -> TokenStream {
142        match self {
143            Type::Int => quote!(Int),
144            Type::Uint => quote!(Uint),
145            Type::Fixed => quote!(Fixed),
146            Type::Array => quote!(Array),
147            Type::Fd => quote!(Fd),
148            Type::String => quote!(Str),
149            Type::Object => quote!(Object),
150            Type::NewId => quote!(NewId),
151            Type::Destructor => panic!("Destructor is not a valid argument type."),
152        }
153    }
154}