1// Copyright 2015 Brendan Zabarauskas and the gl-rs developers
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15use registry::{Cmd, Enum, Registry};
16use std::io;
17use Api;
18
19pub mod debug_struct_gen;
20pub mod global_gen;
21pub mod static_gen;
22pub mod static_struct_gen;
23pub mod struct_gen;
24
25/// Trait for a bindings generator.
26///
27/// See https://github.com/brendanzab/gl-rs/tree/master/gl_generator#generator-types
28pub trait Generator {
29 /// Builds the GL bindings.
30 fn write<W>(&self, registry: &Registry, dest: &mut W) -> io::Result<()>
31 where
32 W: io::Write;
33}
34
35pub fn gen_struct_name(api: Api) -> &'static str {
36 match api {
37 Api::Gl => "Gl",
38 Api::Glx => "Glx",
39 Api::Wgl => "Wgl",
40 Api::Egl => "Egl",
41 Api::GlCore => "GlCore",
42 Api::Gles1 => "Gles1",
43 Api::Gles2 => "Gles2",
44 Api::Glsc2 => "Glsc2",
45 }
46}
47
48/// This function generates a `const name: type = value;` item.
49pub fn gen_enum_item<W>(enm: &Enum, types_prefix: &str, dest: &mut W) -> io::Result<()>
50where
51 W: io::Write,
52{
53 writeln!(dest,
54 "#[allow(dead_code, non_upper_case_globals)] pub const {ident}: {types_prefix}{ty} = {value}{cast_suffix};",
55 ident = enm.ident,
56 types_prefix = if enm.ty == "&'static str" { "" } else { types_prefix },
57 ty = enm.ty,
58 value = enm.value,
59 cast_suffix = match enm.cast {
60 true => format!(" as {}{}", types_prefix, enm.ty),
61 false => String::new(),
62 },
63 )
64}
65
66/// Generates all the type aliases for a namespace.
67///
68/// Aliases are either `pub type = ...` or `#[repr(C)] pub struct ... { ... }` and contain all the
69/// things that we can't obtain from the XML files.
70pub fn gen_types<W>(api: Api, dest: &mut W) -> io::Result<()>
71where
72 W: io::Write,
73{
74 if let Api::Egl = api {
75 try!(writeln!(dest, "{}", include_str!("templates/types/egl.rs")));
76 return Ok(());
77 }
78
79 try!(writeln!(dest, "{}", include_str!("templates/types/gl.rs")));
80
81 match api {
82 Api::Glx => try!(writeln!(dest, "{}", include_str!("templates/types/glx.rs"))),
83 Api::Wgl => try!(writeln!(dest, "{}", include_str!("templates/types/wgl.rs"))),
84 _ => {},
85 }
86
87 Ok(())
88}
89
90/// Generates the list of Rust `Arg`s that a `Cmd` requires.
91pub fn gen_parameters(cmd: &Cmd, with_idents: bool, with_types: bool) -> Vec<String> {
92 cmdimpl Iterator.params
93 .iter()
94 .map(|binding: &Binding| {
95 // returning
96 if with_idents && with_types {
97 format!("{}: {}", binding.ident, binding.ty)
98 } else if with_types {
99 format!("{}", binding.ty)
100 } else if with_idents {
101 format!("{}", binding.ident)
102 } else {
103 panic!()
104 }
105 })
106 .collect()
107}
108
109/// Generates the native symbol name of a `Cmd`.
110///
111/// Example results: `"glClear"`, `"wglCreateContext"`, etc.
112pub fn gen_symbol_name(api: Api, cmd: &str) -> String {
113 match api {
114 Api::Gl | Api::GlCore | Api::Gles1 | Api::Gles2 | Api::Glsc2 => format!("gl{}", cmd),
115 Api::Glx => format!("glX{}", cmd),
116 Api::Wgl => format!("wgl{}", cmd),
117 Api::Egl => format!("egl{}", cmd),
118 }
119}
120