@@ -24,8 +24,14 @@ struct Args {
2424 /// Input mass-spec file (mzML currently; others TBD)
2525 filename : PathBuf ,
2626
27- /// MassQL query
28- query : String ,
27+ /// MassQL query (required unless `--query-yaml` is given).
28+ query : Option < String > ,
29+
30+ /// Read the MassQL query from the `query:` field of a YAML file
31+ /// instead of the positional argument. Mutually exclusive with
32+ /// the positional `<QUERY>`.
33+ #[ arg( long, conflicts_with = "query" ) ]
34+ query_yaml : Option < PathBuf > ,
2935
3036 /// Output TSV file (.tsv) or CSV (.csv) path. `.tsv` uses tab
3137 /// separator, otherwise comma.
@@ -56,11 +62,41 @@ struct Args {
5662 translate : bool ,
5763}
5864
65+ /// Narrow shape of what we pull out of the YAML file — we only care
66+ /// about the `query` key, but we allow unknown siblings so callers
67+ /// can pile whatever else they want in the file alongside it.
68+ #[ derive( serde:: Deserialize ) ]
69+ struct QueryYaml {
70+ query : String ,
71+ }
72+
73+ fn resolve_query ( args : & Args ) -> Result < String , String > {
74+ if let Some ( q) = & args. query {
75+ return Ok ( q. clone ( ) ) ;
76+ }
77+ if let Some ( path) = & args. query_yaml {
78+ let text = std:: fs:: read_to_string ( path)
79+ . map_err ( |e| format ! ( "read {}: {}" , path. display( ) , e) ) ?;
80+ let parsed: QueryYaml = serde_yaml:: from_str ( & text)
81+ . map_err ( |e| format ! ( "parse {} as YAML: {}" , path. display( ) , e) ) ?;
82+ return Ok ( parsed. query ) ;
83+ }
84+ Err ( "missing query: pass <QUERY> positionally or --query-yaml PATH" . into ( ) )
85+ }
86+
5987fn main ( ) -> ExitCode {
6088 let args = Args :: parse ( ) ;
6189
90+ let query = match resolve_query ( & args) {
91+ Ok ( q) => q,
92+ Err ( e) => {
93+ eprintln ! ( "{}" , e) ;
94+ return ExitCode :: from ( 2 ) ;
95+ }
96+ } ;
97+
6298 if args. translate {
63- match massql_translator:: translate_query ( & args . query , massql_translator:: Lang :: English ) {
99+ match massql_translator:: translate_query ( & query, massql_translator:: Lang :: English ) {
64100 Ok ( s) => {
65101 println ! ( "{}" , s) ;
66102 return ExitCode :: SUCCESS ;
@@ -80,7 +116,7 @@ fn main() -> ExitCode {
80116 }
81117 } ;
82118
83- let result = match process_query ( & args . query , & dataset) {
119+ let result = match process_query ( & query, & dataset) {
84120 Ok ( r) => r,
85121 Err ( e) => {
86122 eprintln ! ( "query error: {}" , e) ;
0 commit comments