add --parse

This commit is contained in:
figsoda 2023-01-12 15:03:27 -05:00
parent 30eb520ee2
commit 708ca82d5f
6 changed files with 54 additions and 1 deletions

View File

@ -33,6 +33,12 @@ pub struct Opts {
#[arg(short, long, group = "format")]
pub json: bool,
/// parse the url without fetching the hash, similar to --json
///
/// note that --arg(-str) and --overwrite(-str) will be ignored silently
#[arg(short, long, group = "format")]
pub parse: bool,
/// additional arguments to pass to the fetcher
#[arg(short, long = "arg", num_args = 2, value_names = ["NAME", "EXPR"])]
pub args: Vec<String>,

View File

@ -59,6 +59,13 @@ pub trait Fetcher<'a> {
overwrites: Vec<(String, String)>,
overwrites_str: Vec<(String, String)>,
) -> Result<()>;
fn to_json(
&'a self,
out: &mut impl ::std::io::Write,
url: &'a ::url::Url,
rev: Option<String>,
) -> ::anyhow::Result<()>;
}
#[enum_dispatch(Fetcher)]
@ -164,6 +171,42 @@ macro_rules! impl_fetcher {
overwrites_str,
)
}
fn to_json(
&'a self,
out: &mut impl ::std::io::Write,
url: &'a ::url::Url,
rev: Option<String>,
) -> ::anyhow::Result<()> {
use anyhow::Context;
use serde_json::{json, Value};
let values = self
.get_values(url)
.with_context(|| format!("failed to parse {url}"))?;
let mut fetcher_args = Value::from_iter(Self::KEYS.into_iter().zip(values));
if let Some(host) = self.host() {
fetcher_args[Self::HOST_KEY] = json!(host);
}
if let Some(group) = self.group() {
fetcher_args["group"] = json!(group);
}
if let Some(rev) = rev {
fetcher_args["rev"] = json!(rev);
}
serde_json::to_writer(
out,
&json!({
"fetcher": Self::NAME,
"args": fetcher_args,
}),
)?;
Ok(())
}
}
};
}

View File

@ -152,6 +152,8 @@ fn main() -> Result<()> {
opts.overwrites.into_iter().tuples().collect(),
opts.overwrites_str.into_iter().tuples().collect(),
)
} else if opts.parse {
fetcher.to_json(out, &opts.url, opts.rev)
} else {
let mut overwrites: FxHashMap<_, _> = opts.overwrites.into_iter().tuples().collect();

1
tests/cmd/parse.stdout Normal file
View File

@ -0,0 +1 @@
{"args":{"owner":"nix-community","repo":"nurl","rev":"v0.3.0"},"fetcher":"fetchFromGitHub"}

1
tests/cmd/parse.toml Normal file
View File

@ -0,0 +1 @@
args = ["https://github.com/nix-community/nurl", "v0.3.0", "--parse"]

View File

@ -23,7 +23,7 @@ fn verify_outputs() {
.strip_suffix(".stdout")
.unwrap();
if matches!(name, "hash" | "json") {
if matches!(name, "hash" | "json" | "parse") {
eprintln!("skipping {}", path.display());
continue;
}