github_webhook_dts_downloader/
lib.rs1use 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 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}