|
1 | 1 | use anyhow::{anyhow, bail, Result}; |
2 | 2 | use csaf_lib::csaf::csaf2_0::loader::load_document as load_document_2_0; |
3 | 3 | use csaf_lib::csaf::csaf2_1::loader::load_document as load_document_2_1; |
4 | | -use csaf_lib::csaf::validation::{validate_by_profile, Validatable, ValidationProfile}; |
| 4 | +use csaf_lib::csaf::validation::{validate_by_profile, validate_by_test, Validatable, ValidationProfile}; |
5 | 5 | use std::env; |
| 6 | +use clap::Parser; |
6 | 7 |
|
7 | | -fn main() -> Result<()> { |
8 | | - let args: Vec<String> = env::args().collect(); |
| 8 | +/// A validator for CSAF documents |
| 9 | +#[derive(Parser, Debug)] |
| 10 | +#[command(version, about, long_about = None)] |
| 11 | +struct Args { |
| 12 | + #[arg()] |
| 13 | + path: String, |
| 14 | + |
| 15 | + /// Version of CSAF to use |
| 16 | + #[arg(short, long, default_value = "2.0")] |
| 17 | + csaf_version: String, |
9 | 18 |
|
10 | | - let path = match args.get(1) { |
11 | | - None => return Err(anyhow!("Please specify a file to validate")), |
12 | | - Some(v) => v, |
13 | | - }; |
| 19 | + /// The profile to use |
| 20 | + #[arg(short, long, default_value = "basic")] |
| 21 | + profile: String, |
| 22 | + |
| 23 | + /// Run only the selected test |
| 24 | + #[arg(short, long)] |
| 25 | + only_test: Option<String>, |
| 26 | +} |
14 | 27 |
|
| 28 | +fn main() -> Result<()> { |
| 29 | + let args = Args::parse(); |
15 | 30 | let profile = ValidationProfile::Basic; |
16 | 31 |
|
17 | 32 | // TODO: it would be nice to return the validatable from this match, but this is beyond my |
18 | 33 | // rust generics knowledge, so a little bit of duplicate code here |
19 | | - let version = args.get(2).cloned().unwrap_or("2.0".to_string()); |
20 | | - let result = match version.as_str() { |
21 | | - "2.0" => { |
22 | | - validate_by_profile(load_document_2_0(path)?, profile) |
23 | | - } |
24 | | - "2.1" => { |
25 | | - validate_by_profile(load_document_2_1(path)?, profile) |
26 | | - } |
27 | | - _ => bail!("invalid version"), |
28 | | - }; |
29 | | - |
30 | | - Ok(result) |
| 34 | + if let Some(test_id) = args.only_test { |
| 35 | + let result = match args.csaf_version.as_str() { |
| 36 | + "2.0" => { |
| 37 | + validate_by_test(load_document_2_0(args.path.as_str())?, test_id.as_str()) |
| 38 | + } |
| 39 | + "2.1" => { |
| 40 | + validate_by_test(load_document_2_1(args.path.as_str())?, test_id.as_str()) |
| 41 | + } |
| 42 | + _ => bail!("invalid version"), |
| 43 | + }; |
| 44 | + |
| 45 | + Ok(result) |
| 46 | + } else { |
| 47 | + let result = match args.csaf_version.as_str() { |
| 48 | + "2.0" => { |
| 49 | + validate_by_profile(load_document_2_0(args.path.as_str())?, profile) |
| 50 | + } |
| 51 | + "2.1" => { |
| 52 | + validate_by_profile(load_document_2_1(args.path.as_str())?, profile) |
| 53 | + } |
| 54 | + _ => bail!("invalid version"), |
| 55 | + }; |
| 56 | + |
| 57 | + Ok(result) |
| 58 | + } |
31 | 59 | } |
0 commit comments