Modernize imgui-sys-bindgen code slightly

This commit is contained in:
Joonas Javanainen 2020-04-24 23:08:29 +03:00
parent 6ee5a2867b
commit a69d856163
No known key found for this signature in database
GPG Key ID: D39CCA5CB19B9179
3 changed files with 19 additions and 21 deletions

View File

@ -2,6 +2,7 @@
name = "imgui-sys-bindgen"
version = "0.0.0"
authors = ["Joonas Javanainen <joonas.javanainen@gmail.com>", "imgui-rs contributors"]
edition = "2018"
description = "imgui-sys bindings updater"
homepage = "https://github.com/Gekkio/imgui-rs"
repository = "https://github.com/Gekkio/imgui-rs"
@ -10,7 +11,6 @@ publish = false
[dependencies]
bindgen = "0.53"
failure = "0.1"
serde = "1.0"
serde_derive = "1.0"
serde_json = "1.0"

View File

@ -1,17 +1,23 @@
extern crate bindgen;
#[macro_use]
extern crate failure;
#[macro_use]
extern crate serde_derive;
extern crate serde_json;
use bindgen::{Bindings, EnumVariation, RustTarget};
use failure::Error;
use serde_derive::Deserialize;
use std::collections::HashMap;
use std::error::Error;
use std::fmt;
use std::fs::{read_to_string, File};
use std::io::Read;
use std::path::Path;
#[derive(Debug)]
struct BindgenError;
impl fmt::Display for BindgenError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "Failed to generate bindings")
}
}
impl Error for BindgenError {}
#[derive(Deserialize)]
struct StructsAndEnums {
enums: HashMap<String, serde_json::Value>,
@ -38,17 +44,13 @@ struct Whitelist {
definitions: Vec<String>,
}
fn only_key<K, V>((key, _): (K, V)) -> K {
key
}
fn parse_whitelist<R: Read>(
structs_and_enums: R,
definitions: R,
) -> Result<Whitelist, serde_json::Error> {
let StructsAndEnums { enums, structs } = serde_json::from_reader(structs_and_enums)?;
let enums = enums.into_iter().map(only_key).collect();
let structs = structs.into_iter().map(only_key).collect();
let enums = enums.keys().cloned().collect();
let structs = structs.keys().cloned().collect();
let definitions: HashMap<String, Vec<Definition>> = serde_json::from_reader(definitions)?;
let definitions = definitions
@ -74,7 +76,7 @@ fn parse_whitelist<R: Read>(
pub fn generate_bindings<P: AsRef<Path>>(
path: &P,
wasm_import_name: Option<String>,
) -> Result<Bindings, Error> {
) -> Result<Bindings, Box<dyn Error>> {
let path = path.as_ref();
let structs_and_enums = File::open(path.join("structs_and_enums.json"))?;
let definitions = File::open(path.join("definitions.json"))?;
@ -116,8 +118,6 @@ pub fn generate_bindings<P: AsRef<Path>>(
for e in whitelist.definitions {
builder = builder.whitelist_function(format!("^{}", e));
}
let bindings = builder
.generate()
.map_err(|_| format_err!("Failed to generate bindings"))?;
let bindings = builder.generate().map_err(|_| BindgenError)?;
Ok(bindings)
}

View File

@ -1,5 +1,3 @@
extern crate imgui_sys_bindgen;
use imgui_sys_bindgen::generate_bindings;
use std::env;