Skip to content

Commit 44368a2

Browse files
committed
CLI
1 parent 3c9e7ec commit 44368a2

File tree

2 files changed

+48
-19
lines changed

2 files changed

+48
-19
lines changed

renderer/src/lib.rs

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,10 @@ mod html;
55
use std::io::Write;
66

77
use anyhow::{Error, anyhow};
8-
use schemars::schema_for;
9-
108
use document_tree::Document;
119

12-
pub use html::render_html;
10+
pub use crate::html::render_html;
11+
pub use schemars::generate::SchemaSettings;
1312

1413
/// Render a document tree as JSON.
1514
///
@@ -25,12 +24,18 @@ where
2524

2625
#[expect(clippy::missing_panics_doc, reason = "infallible")]
2726
/// Render the JSON schema for [`document_tree::Document`].
28-
pub fn render_json_schema_document<W>(stream: W)
27+
pub fn render_json_schema_document<W>(stream: W, settings: SchemaSettings, pretty: bool)
2928
where
3029
W: Write,
3130
{
32-
let schema = schema_for!(document_tree::Document);
33-
serde_json::to_writer(stream, &schema).unwrap();
31+
let generator = settings.into_generator();
32+
let schema = generator.into_root_schema_for::<document_tree::Document>();
33+
let w = if pretty {
34+
serde_json::to_writer_pretty
35+
} else {
36+
serde_json::to_writer
37+
};
38+
w(stream, &schema).unwrap();
3439
}
3540

3641
/// Render a document tree as XML.

rst/src/main.rs

Lines changed: 37 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,31 @@
33
use clap::Parser;
44

55
use 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

810
use std::io::{self, Read};
911

1012
#[derive(Debug, Clone, clap::ValueEnum)]
11-
#[allow(non_camel_case_types)]
1213
enum 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

3247
fn 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

Comments
 (0)