This commit is contained in:
Steve Biedermann 2024-05-12 23:27:33 +02:00
parent 26ea87b295
commit cffd853114
7 changed files with 193 additions and 9 deletions

42
Cargo.lock generated
View File

@ -145,6 +145,47 @@ dependencies = [
"strsim",
]
[[package]]
name = "clap_complete"
version = "4.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dd79504325bf38b10165b02e89b4347300f855f273c4cb30c4a3209e6583275e"
dependencies = [
"clap",
]
[[package]]
name = "clap_complete_command"
version = "0.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "183495371ea78d4c9ff638bfc6497d46fed2396e4f9c50aebc1278a4a9919a3d"
dependencies = [
"clap",
"clap_complete",
"clap_complete_fig",
"clap_complete_nushell",
]
[[package]]
name = "clap_complete_fig"
version = "4.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "54b3e65f91fabdd23cac3d57d39d5d938b4daabd070c335c006dccb866a61110"
dependencies = [
"clap",
"clap_complete",
]
[[package]]
name = "clap_complete_nushell"
version = "0.1.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5d02bc8b1a18ee47c4d2eec3fb5ac034dc68ebea6125b1509e9ccdffcddce66e"
dependencies = [
"clap",
"clap_complete",
]
[[package]]
name = "clap_derive"
version = "4.5.4"
@ -476,6 +517,7 @@ version = "0.1.0"
dependencies = [
"anyhow",
"clap",
"clap_complete_command",
"crossterm 0.27.0",
"indexmap",
"markdown",

View File

@ -9,6 +9,7 @@ default-run = "req"
[dependencies]
anyhow = "1.0.83"
clap = { version = "4.5.4", features = ["derive"] }
clap_complete_command = "0.5.1"
crossterm = "0.27.0"
indexmap = { version = "2.2.6", features = ["serde"] }
markdown = "1.0.0-alpha.17"

View File

@ -7,6 +7,6 @@ mkdir -p out
cargo build
cargo run -q -- schema > out/schema.json
cargo run -q -- demo > out/demo.yml
cargo run -q -- md req.yml > out/requirements.md
cargo run -q -- html req.yml > out/requirements.html
cargo run -q -- check req.yml test_result.txt > out/text_result.md
cargo run -q -- md requirements.yml > out/requirements.md
cargo run -q -- html requirements.yml > out/requirements.html
cargo run -q -- check requirements.yml test_result.txt > out/text_result.md

View File

@ -125,6 +125,7 @@ pub struct Project {
serialize_with = "serialize_version",
deserialize_with = "deserialize_version"
)]
#[schemars(with = "String", regex(pattern = r"^\d\.\d\.\d$"))]
pub version: Version,
#[serde(serialize_with = "my_trim")]
pub description: String,
@ -138,5 +139,5 @@ pub struct Project {
#[must_use]
pub fn demo_project() -> Project {
serde_yaml::from_str(include_str!("../req.yml")).expect("Should never happen!")
serde_yaml::from_str(include_str!("../requirements.yml")).expect("Should never happen!")
}

View File

@ -1,6 +1,6 @@
use std::path::PathBuf;
use clap::Parser;
use clap::{CommandFactory, Parser, Subcommand};
use indexmap::{
map::{Keys, Values},
IndexMap,
@ -39,7 +39,7 @@ fn check_requirements(
requirements: &IndexMap<String, Requirement>,
allowed_requirements: &Regex,
) {
for (id, _) in dbg!(requirements) {
for (id, _) in requirements {
if allowed_requirements.is_match(id) {
if test_results.contains(&format!("{}: failed", id.trim())) {
output.insert(id.trim().to_string(), false);
@ -163,7 +163,7 @@ fn add_topics(output: &mut Vec<String>, topics: &IndexMap<String, Topic>, level:
}
}
#[derive(Parser)]
#[derive(Subcommand)]
enum Command {
/// Outputs the JSON schema for the input data
Schema,
@ -191,6 +191,12 @@ enum Command {
#[arg(required=true, num_args=1..)]
test_results: Vec<PathBuf>,
},
/// Generate shell completions
Completions {
/// The shell to generate the completions for
#[arg(value_enum)]
shell: clap_complete_command::Shell,
},
}
#[derive(Parser)]
@ -295,10 +301,14 @@ fn main() -> anyhow::Result<()> {
}
Command::Html { requirements } => {
let output = to_markdown(requirements, false)?;
let template = include_str!("../template.html");
println!(
"{}",
markdown::to_html_with_options(&output, &markdown::Options::gfm())
.map_err(|e| anyhow::anyhow!("{e}"))?
template.replace(
"{{content}}",
&markdown::to_html_with_options(&output, &markdown::Options::gfm())
.map_err(|e| anyhow::anyhow!("{e}"))?
)
);
}
Command::Schema => {
@ -322,7 +332,11 @@ fn main() -> anyhow::Result<()> {
let output = output.join("\n");
println!("{output}");
}
Command::Completions { shell } => {
shell.generate(&mut Args::command(), &mut std::io::stdout());
}
}
Ok(())
}

126
template.html Normal file
View File

@ -0,0 +1,126 @@
<head>
<style>
/* General body styling */
body {
font-family: Arial, sans-serif;
line-height: 1.6;
color: #333;
padding: 20px;
max-width: 1000px;
margin: auto;
}
/* Heading styles */
h1,
h2,
h3,
h4,
h5,
h6 {
color: #0056b3;
margin-top: 20px;
}
h1 {
border-bottom: 2px solid #eee;
padding-bottom: 10px;
}
h2 {
color: #004494;
}
h3 {
color: #003073;
}
h4,
h5,
h6 {
color: #002652;
font-style: italic;
font-size: 1em;
/* Ensures that subtopic headings don't scale down too much */
font-weight: bold;
/* Adds emphasis to make subtopic headings stand out */
}
/* RFC keywords styling */
p {
font-size: 16px;
}
strong em {
color: #d63447;
/* Bright red for MUST, SHOULD, etc. */
font-style: normal;
/* Override italic style from em */
}
/* Link styling */
a {
color: #007bff;
text-decoration: none;
}
a:hover {
text-decoration: underline;
}
/* List styling for better readability */
ul {
list-style-type: none;
padding-left: 20px;
}
ul li {
margin-bottom: 5px;
}
ul>li:not(:has(> p))::before {
content: "• ";
color: #007bff;
/* Matching the link color */
font-size: larger;
}
ul>li:not(:has(> ul))>p::before {
content: "• ";
color: #007bff;
/* Matching the link color */
font-size: larger;
}
/* Nested lists to indicate hierarchy */
ul ul {
padding-left: 20px;
}
/* Version and requirements emphasis */
strong {
font-weight: bold;
}
/* Special styling for configuration sections */
h2 {
border-bottom: 1px solid #ccc;
padding-bottom: 5px;
}
/* Config and Definitions section styling */
ul ul li {
font-size: 14px;
color: #555;
}
/* Detailed requirement items */
li strong em {
display: inline-block;
/* Ensures consistent alignment */
}
</style>
</head>
<body>
{{content}}
</body>