//! Macros utilizing the [OpenGL API and Extension Registry]. //! //! [OpenGL API and Extension Registry]: https://github.com/KhronosGroup/OpenGL-Registry #![cfg_attr(test, feature(test))] #![deny(clippy::all, clippy::pedantic, missing_docs)] use once_cell::sync::Lazy; use opengl_registry::Registry; use proc_macro::TokenStream; use crate::repeat::for_each_opengl_command_impl; mod iter; mod repeat; mod str; mod token_stream; const OPENGL_CMD_NAME_REPLACE: &str = "gl_command_name"; const OPENGL_CMD_NAME_NOPREFIX_REPLACE: &str = "gl_command_name_noprefix"; const OPENGL_CMD_RET_TYPE_REPLACE: &str = "gl_command_ret_type"; const OPENGL_CMD_ARGS_REPLACE: &str = "gl_command_args"; const OPENGL_CMD_ARG_NAMES_REPLACE: &str = "gl_command_arg_names"; const OPENGL_CMD_ARG_TYPES_REPLACE: &str = "gl_command_arg_types"; static OPENGL_REGISTRY: Lazy = Lazy::new(|| Registry::retrieve().unwrap()); /// Repeats the input for each command in the [OpenGL API and Extension Registry]. /// /// # Replacements /// This macro will replace some specific identifiers **prefixed with a hashtag**. /// /// ### The following identifiers will be replaced /// /// **`gl_command_name`**
/// Will be replaced by the full command name. For example, `glViewport`. /// /// **`gl_command_name_noprefix`**
/// Will be replaced by the command name without the "gl" prefix. For example, /// `Viewport`. /// /// **`gl_command_ret_type`**
/// Will be replaced by the command return type. For example, `GLuint`. /// /// **`gl_command_args`**
/// Will be replaced by the command arguments formatted as `name: type`, seperated by /// comma. /// /// **`gl_command_arg_names`**
/// Will be replaced by the command argument names, seperated by comma. /// /// **`gl_command_arg_types`**
/// Will be replaced by the command argument types, seperated by comma. /// /// # Examples /// ``` /// # use opengl_registry_macros::for_each_opengl_command; /// for_each_opengl_command! { /// fn #gl_command_name() /// { /// println!("Hello from {}", stringify!(#gl_command_name)); /// } /// } /// ``` /// /// Would expand to the following if the only OpenGL commands were `glCreateShader` and /// `glBindBuffer`. /// /// ``` /// fn glCreateShader() /// { /// println!("Hello from {}", stringify!(glCreateShader)); /// } /// fn glBindBuffer() /// { /// println!("Hello from {}", stringify!(glBindBuffer)); /// } /// ``` /// /// [OpenGL API and Extension Registry]: https://github.com/KhronosGroup/OpenGL-Registry #[proc_macro] pub fn for_each_opengl_command(input_stream: TokenStream) -> TokenStream { for_each_opengl_command_impl(&input_stream.into(), &OPENGL_REGISTRY).into() }