11extern crate bindgen;
2+ extern crate proc_macro2;
23
34use std:: env;
45use 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
667fn 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