Listen to git commits for a specific repo and run a shell command
1pub fn find_knot(did: &String, repo_name: &String, pds: &String) -> Result<String, ()> {
2 // https://docs.bsky.app/docs/api/com-atproto-repo-list-records
3 let mut cursor: Option<String> = None;
4
5 loop {
6 let url = format!(
7 "{0}/xrpc/com.atproto.repo.listRecords?collection=sh.tangled.repo&repo={1}&cursor={2}",
8 pds.clone(),
9 did.clone(),
10 cursor.clone().unwrap_or(String::new())
11 );
12
13 let res = match reqwest::blocking::get(url) {
14 Ok(val) => val,
15 Err(_) => {
16 println!(" Failed to load repos.");
17 return Err(());
18 }
19 };
20
21 if !res.status().is_success() {
22 println!(" Got non 2xx code when loading repos");
23 return Err(());
24 }
25
26 let body = match res.text() {
27 Ok(val) => match json::parse(&val) {
28 Ok(val) => val,
29 Err(_) => {
30 println!(" Invalid or malformed response response");
31 return Err(());
32 }
33 },
34 Err(_) => {
35 println!(" Missing body from response");
36 return Err(());
37 }
38 };
39
40 // must contain a records array
41 if !body["records"].is_array() {
42 println!(" Invalid or malformed response response");
43 return Err(());
44 }
45 for record in body["records"].members() {
46 if let Some(val) = record["value"]["name"].as_str()
47 && val == repo_name
48 {
49 if let Some(knot) = record["value"]["knot"].as_str() {
50 return Ok(String::from(knot));
51 } else {
52 println!(" Repo didn't have a valid knot");
53 return Err(());
54 }
55 }
56 }
57
58 if let Some(val) = body["cursor"].as_str() {
59 cursor = Some(String::from(val))
60 } else {
61 break;
62 }
63 }
64
65 return Err(());
66}