@@ -3,6 +3,7 @@ mod language;
33mod ql;
44mod ql_gen;
55
6+ use clap;
67use language:: Language ;
78use std:: collections:: BTreeMap as Map ;
89use std:: collections:: BTreeSet as Set ;
@@ -369,16 +370,20 @@ fn create_tokeninfo<'a>(
369370 ( case, table)
370371}
371372
372- fn write_dbscheme ( language : & Language , entries : & [ dbscheme:: Entry ] ) -> std:: io:: Result < ( ) > {
373+ fn write_dbscheme (
374+ dbscheme_path : PathBuf ,
375+ language : & Language ,
376+ entries : & [ dbscheme:: Entry ] ,
377+ ) -> std:: io:: Result < ( ) > {
373378 info ! (
374379 "Writing database schema for {} to '{}'" ,
375380 & language. name,
376- match language . dbscheme_path. to_str( ) {
381+ match dbscheme_path. to_str( ) {
377382 None => "<undisplayable>" ,
378383 Some ( p) => p,
379384 }
380385 ) ;
381- let file = File :: create ( & language . dbscheme_path ) ?;
386+ let file = File :: create ( dbscheme_path) ?;
382387 let mut file = LineWriter :: new ( file) ;
383388 dbscheme:: write ( & language. name , & mut file, & entries)
384389}
@@ -665,21 +670,32 @@ fn create_diagnostics<'a>() -> (dbscheme::Case<'a>, dbscheme::Table<'a>) {
665670 ( case, table)
666671}
667672
668- fn main ( ) {
673+ fn main ( ) -> std :: io :: Result < ( ) > {
669674 tracing_subscriber:: fmt ( )
670675 . with_target ( false )
671676 . without_time ( )
672677 . with_level ( true )
673678 . with_env_filter ( tracing_subscriber:: EnvFilter :: from_default_env ( ) )
674679 . init ( ) ;
675680
676- // TODO: figure out proper dbscheme output path and/or take it from the
677- // command line.
681+ let matches = clap:: App :: new ( "Ruby dbscheme generator" )
682+ . version ( "1.0" )
683+ . author ( "GitHub" )
684+ . about ( "CodeQL Ruby dbscheme generator" )
685+ . args_from_usage (
686+ "--dbscheme=<FILE> 'Path of the generated dbscheme file'
687+ --library=<FILE> 'Path of the generated QLL file'" ,
688+ )
689+ . get_matches ( ) ;
690+ let dbscheme_path = matches. value_of ( "dbscheme" ) . expect ( "missing --dbscheme" ) ;
691+ let dbscheme_path = PathBuf :: from ( dbscheme_path) ;
692+
693+ let ql_library_path = matches. value_of ( "library" ) . expect ( "missing --library" ) ;
694+ let ql_library_path = PathBuf :: from ( ql_library_path) ;
695+
678696 let ruby = Language {
679697 name : "Ruby" . to_owned ( ) ,
680698 node_types : tree_sitter_ruby:: NODE_TYPES ,
681- dbscheme_path : PathBuf :: from ( "ql/src/ruby.dbscheme" ) ,
682- ql_library_path : PathBuf :: from ( "ql/src/codeql_ruby/ast/internal/TreeSitter.qll" ) ,
683699 } ;
684700 match node_types:: read_node_types_str ( & ruby. node_types ) {
685701 Err ( e) => {
@@ -689,17 +705,18 @@ fn main() {
689705 Ok ( nodes) => {
690706 let dbscheme_entries = convert_nodes ( & nodes) ;
691707
692- if let Err ( e) = write_dbscheme ( & ruby, & dbscheme_entries) {
708+ if let Err ( e) = write_dbscheme ( dbscheme_path , & ruby, & dbscheme_entries) {
693709 error ! ( "Failed to write dbscheme: {}" , e) ;
694710 std:: process:: exit ( 2 ) ;
695711 }
696712
697713 let classes = ql_gen:: convert_nodes ( & nodes) ;
698714
699- if let Err ( e) = ql_gen:: write ( & ruby, & classes) {
715+ if let Err ( e) = ql_gen:: write ( ql_library_path , & ruby, & classes) {
700716 println ! ( "Failed to write QL library: {}" , e) ;
701717 std:: process:: exit ( 3 ) ;
702718 }
719+ Ok ( ( ) )
703720 }
704721 }
705722}
0 commit comments