1
1
extern crate bindgen;
2
+ extern crate proc_macro2;
2
3
3
4
use std:: env;
4
5
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
+ }
5
66
6
67
fn main ( ) {
7
68
println ! ( "cargo:rustc-link-lib=deepspeech" ) ;
@@ -14,6 +75,5 @@ fn main() {
14
75
. expect ( "Couldn't generate bindings" ) ;
15
76
16
77
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) ;
19
79
}
0 commit comments