Merge pull request #11 from LoganDark/builder

Implement builder pattern; closes #10
This commit is contained in:
JR 2021-02-21 19:31:07 -05:00 committed by GitHub
commit 59618adfed
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 39 additions and 2 deletions

View file

@ -15,3 +15,4 @@ readme = "README.md"
glutin = "0.26.0" glutin = "0.26.0"
gl = "0.10.0" gl = "0.10.0"
rustic_gl = "0.3.2" rustic_gl = "0.3.2"
derive_builder = "0.10.0-alpha"

View file

@ -20,9 +20,21 @@ use glutin::dpi::LogicalSize;
/// from a trait like [`Default`]. The [`config!`][config] macro makes it much less tedious to /// from a trait like [`Default`]. The [`config!`][config] macro makes it much less tedious to
/// construct custom configs. See its documentation for more information. /// construct custom configs. See its documentation for more information.
/// ///
/// Alternatively, you can choose to use the builder pattern instead:
///
/// ```
/// use mini_gl_fb::ConfigBuilder;
///
/// let config = ConfigBuilder::default()
/// .invert_y(false)
/// .build();
/// ```
///
/// If there's a config option you want to see or think is missing, please open an issue! /// If there's a config option you want to see or think is missing, please open an issue!
#[non_exhaustive] #[non_exhaustive]
#[derive(Clone, PartialEq, Debug)] #[builder(default)]
#[builder(build_fn(skip))]
#[derive(Clone, PartialEq, Debug, Builder)]
pub struct Config { pub struct Config {
/// Sets the pixel dimensions of the buffer. The buffer will automatically stretch to fill the /// Sets the pixel dimensions of the buffer. The buffer will automatically stretch to fill the
/// whole window. By default this will be the same as the window_size. /// whole window. By default this will be the same as the window_size.
@ -43,6 +55,28 @@ pub struct Config {
pub invert_y: bool pub invert_y: bool
} }
impl ConfigBuilder {
/// Builds a new [`Config`].
pub fn build(&self) -> Config {
let mut config = Config::default();
macro_rules! fields {
($($n:ident),+) => {
$(
if let Some($n) = &self.$n {
config.$n = $n.clone();
}
)+
}
}
// I guess this is better than implementing the entire builder by hand
fields!(buffer_size, resizable, window_title, window_size, invert_y);
config
}
}
impl Default for Config { impl Default for Config {
fn default() -> Self { fn default() -> Self {
Config { Config {

View file

@ -105,6 +105,8 @@
#[macro_use] #[macro_use]
pub extern crate rustic_gl; pub extern crate rustic_gl;
#[macro_use]
extern crate derive_builder;
pub extern crate glutin; pub extern crate glutin;
pub extern crate gl; pub extern crate gl;
@ -114,7 +116,7 @@ pub mod core;
pub mod breakout; pub mod breakout;
pub use breakout::{GlutinBreakout, BasicInput}; pub use breakout::{GlutinBreakout, BasicInput};
pub use config::Config; pub use config::{Config, ConfigBuilder};
pub use core::{Internal, BufferFormat, Framebuffer}; pub use core::{Internal, BufferFormat, Framebuffer};
use core::ToGlType; use core::ToGlType;