33use clap:: Parser ;
44
55use rst_parser:: parse;
6- use rst_renderer:: { render_html, render_json, render_json_schema_document, render_xml} ;
6+ use rst_renderer:: {
7+ SchemaSettings , render_html, render_json, render_json_schema_document, render_xml,
8+ } ;
79
810use std:: io:: { self , Read } ;
911
1012#[ derive( Debug , Clone , clap:: ValueEnum ) ]
11- #[ allow( non_camel_case_types) ]
1213enum Format {
13- json,
14- xml,
15- html,
14+ Json ,
15+ Xml ,
16+ Html ,
17+ }
18+
19+ #[ derive( Debug , Default , Clone , clap:: ValueEnum ) ]
20+ enum SchemaVersion {
21+ // tooling is hopelessly outdated, draft 7 is kind of the best bet
22+ #[ default]
23+ #[ value( name = "draft7" ) ]
24+ Draft07 ,
25+ #[ value( name = "2019-09" ) ]
26+ Draft2019_09 ,
27+ #[ value( name = "2020-12" ) ]
28+ Draft2020_12 ,
29+ #[ value( name = "openapi3" ) ]
30+ OpenApi3 ,
1631}
1732
1833#[ derive( Debug , Parser ) ]
@@ -25,32 +40,41 @@ struct Cli {
2540 #[ command( flatten) ]
2641 verbosity : clap_verbosity_flag:: Verbosity ,
2742 /// Print schema
28- #[ arg( long) ]
29- schema : bool ,
43+ #[ arg( long, num_args = ..= 1 , require_equals = true , default_missing_value = "draft7" ) ]
44+ schema : Option < SchemaVersion > ,
3045}
3146
3247fn main ( ) -> Result < ( ) , anyhow:: Error > {
3348 let args = Cli :: parse ( ) ;
3449
35- let level_filter = args. verbosity . log_level ( ) . unwrap ( ) . to_level_filter ( ) ;
50+ let level_filter = args
51+ . verbosity
52+ . log_level ( )
53+ . map_or ( log:: LevelFilter :: Off , |l| l. to_level_filter ( ) ) ;
3654 env_logger:: Builder :: new ( )
3755 . filter ( Some ( "rst" ) , level_filter)
3856 . filter ( None , log:: Level :: Warn . to_level_filter ( ) )
3957 . try_init ( ) ?;
4058
4159 let stdout = std:: io:: stdout ( ) ;
4260
43- if args. schema {
44- render_json_schema_document ( stdout) ;
61+ if let Some ( schema) = & args. schema {
62+ let settings = match schema {
63+ SchemaVersion :: Draft07 => SchemaSettings :: draft07 ( ) ,
64+ SchemaVersion :: Draft2019_09 => SchemaSettings :: draft2019_09 ( ) ,
65+ SchemaVersion :: Draft2020_12 => SchemaSettings :: draft2020_12 ( ) ,
66+ SchemaVersion :: OpenApi3 => SchemaSettings :: openapi3 ( ) ,
67+ } ;
68+ render_json_schema_document ( stdout, settings, level_filter. to_level ( ) . is_some ( ) ) ;
4569 return Ok ( ( ) ) ;
4670 }
4771
4872 let content = preprocess_content ( args. file . as_deref ( ) ) ?;
4973 let document = parse ( & content) ?;
5074 match args. format {
51- Format :: json => render_json ( & document, stdout) ?,
52- Format :: xml => render_xml ( & document, stdout) ?,
53- Format :: html => render_html ( & document, stdout, true ) ?,
75+ Format :: Json => render_json ( & document, stdout) ?,
76+ Format :: Xml => render_xml ( & document, stdout) ?,
77+ Format :: Html => render_html ( & document, stdout, true ) ?,
5478 }
5579 Ok ( ( ) )
5680}
0 commit comments