Listen to git commits for a specific repo and run a shell command
at master 2.1 kB view raw
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}