Skip to content
This repository was archived by the owner on Mar 5, 2022. It is now read-only.

Commit 3323b0e

Browse files
committed
Pretty-print the generated bindings
Per default, bindgen puts everything onto one line. This pretty printer will insert newlines for better readability. See rust-lang/rust-bindgen#1600
1 parent 1caaaf9 commit 3323b0e

File tree

3 files changed

+64
-2
lines changed

3 files changed

+64
-2
lines changed

Cargo.lock

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

sys/Cargo.toml

+1
Original file line numberDiff line numberDiff line change
@@ -14,3 +14,4 @@ include = ["deepspeech/native_client/deepspeech.h", "/src/**",
1414

1515
[build-dependencies]
1616
bindgen = { version = "0.51", default-features = false }
17+
proc-macro2 = { version = "0.4", default-features = false }

sys/build.rs

+62-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,68 @@
11
extern crate bindgen;
2+
extern crate proc_macro2;
23

34
use std::env;
45
use std::path::PathBuf;
6+
use std::path::Path;
7+
8+
fn write_to_file(path: impl AsRef<Path>, bindings: &bindgen::Bindings) {
9+
use proc_macro2::{TokenStream, TokenTree, Spacing, Delimiter};
10+
use std::str::FromStr;
11+
let str_bindings = bindings.to_string();
12+
let tokens = TokenStream::from_str(&str_bindings).unwrap();
13+
let mut res_str = String::new();
14+
struct TokenVisitor<'s> {
15+
s: &'s mut String,
16+
}
17+
impl<'s> TokenVisitor<'s> {
18+
fn visit_stream(&mut self, stream: TokenStream) {
19+
let mut iter = stream.into_iter().peekable();
20+
while let Some(tree) = iter.next() {
21+
self.visit_tree(tree, iter.peek().is_some());
22+
}
23+
}
24+
fn visit_tree(&mut self, tree: TokenTree, put_space: bool) {
25+
let mut put_space = put_space;
26+
match tree {
27+
TokenTree::Group(group) => {
28+
match group.delimiter() {
29+
Delimiter::Brace => {
30+
*self.s += "{\n";
31+
self.visit_stream(group.stream());
32+
*self.s += "\n}\n";
33+
},
34+
_ => *self.s += &group.to_string(),
35+
}
36+
},
37+
TokenTree::Ident(ident) => {
38+
*self.s += &ident.to_string();
39+
},
40+
TokenTree::Punct(punct) => {
41+
if punct.spacing() == Spacing::Alone && punct.as_char() == ';' {
42+
*self.s += &punct.to_string();
43+
*self.s += "\n";
44+
} else {
45+
*self.s += &punct.to_string();
46+
}
47+
if punct.spacing() == Spacing::Joint {
48+
put_space = false;
49+
}
50+
},
51+
TokenTree::Literal(l) => {
52+
*self.s += &l.to_string();
53+
},
54+
}
55+
if put_space {
56+
*self.s += " ";
57+
}
58+
}
59+
}
60+
let mut visitor = TokenVisitor {
61+
s: &mut res_str
62+
};
63+
visitor.visit_stream(tokens);
64+
std::fs::write(path, visitor.s.as_bytes()).unwrap();
65+
}
566

667
fn main() {
768
println!("cargo:rustc-link-lib=deepspeech");
@@ -14,6 +75,5 @@ fn main() {
1475
.expect("Couldn't generate bindings");
1576

1677
let out_path = PathBuf::from(env::var("OUT_DIR").unwrap());
17-
bindings.write_to_file(out_path.join("bindings.rs"))
18-
.expect("Couldn't write bindings!");
78+
write_to_file(out_path.join("bindings.rs"), &bindings);
1979
}

0 commit comments

Comments
 (0)