github_webhook_dts_downloader/
lib.rs

1use std::env;
2use std::fs::File;
3use std::io::{self, BufWriter, Write};
4use std::path::PathBuf;
5use std::process::Command;
6
7use anyhow::Result;
8
9use github_webhook_type_generator::dts2rs;
10
11#[derive(Default)]
12pub struct Opt {
13    pub version: Version,
14    pub out_path_ts: OutPathTs,
15    pub out_path_rs: OutPathRs,
16}
17
18pub struct Version(pub String);
19
20impl Default for Version {
21    fn default() -> Self {
22        Self("master".to_string())
23    }
24}
25
26pub struct OutPathTs(PathBuf);
27
28impl Default for OutPathTs {
29    fn default() -> Self {
30        let mut path = PathBuf::from(env::var("OUT_DIR").unwrap());
31        path.push("schema.d.ts");
32        Self(path)
33    }
34}
35
36pub struct OutPathRs(PathBuf);
37
38impl Default for OutPathRs {
39    fn default() -> Self {
40        let mut path = PathBuf::from(env::var("OUT_DIR").unwrap());
41        path.push("types.rs");
42        Self(path)
43    }
44}
45
46pub fn run_transform(
47    Opt {
48        version: Version(branch),
49        out_path_ts: OutPathTs(dts_file),
50        out_path_rs: OutPathRs(rs_file),
51    }: Opt,
52) -> Result<()> {
53    // setup .d.ts file
54    let repo = "octokit/webhooks";
55    let url =
56        format!("https://raw.githubusercontent.com/{repo}/{branch}/payload-types/schema.d.ts");
57
58    let body = reqwest::blocking::get(url)?.text()?;
59    std::fs::write(&dts_file, body)?;
60
61    let rs = dts2rs(&dts_file);
62
63    let mut writer = BufWriter::new(File::create(&rs_file)?);
64    write!(writer, "{rs}")?;
65    writer.into_inner()?;
66
67    let output = Command::new("rustfmt").arg(rs_file).output()?;
68    let status = output.status;
69    if !status.success() {
70        io::stderr().write_all(&output.stderr).unwrap();
71        panic!("failed to execute rustfmt: {status}")
72    }
73
74    Ok(())
75}