Something went wrong. Try again.
Listen to git commits for a specific repo and run a shell command
Something went wrong. Try again.
2.4 kB · 84 lines
Rust
at master
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485use std::process::Command;
mod args;mod did;mod knot;
fn main() -> Result<(), ()> { // load configuration let config = match args::load_config() { Ok(res) => res, Err(_) => return Err(()), };
// resolve handle to did println!("Resolving {}", config.handle); let did_doc = match did::get_did(&config.handle) { Ok(res) => res, Err(_) => return Err(()), }; println!( " Found DID `{0}` hosted at `{1}`", did_doc.did, did_doc.pds );
// resolve did+repoName to knotserver println!("Resolving @{0}/{1}", config.handle, config.repo_name); let knot_server = match knot::find_knot(&did_doc.did, &config.repo_name, &did_doc.pds) { Ok(val) => val, Err(_) => return Err(()), }; println!(" Found knot `{}`", knot_server);
// connect to /events on knotserver println!( "Connecting to `{}`", format!("wss://{}/events", knot_server) );
match ws::connect(format!("ws://{}/events", knot_server), |_out| { println!(" Connection successful"); |msg: ws::Message| { // parse json let body = match json::parse(match msg.as_text() { Ok(val) => val, Err(_) => return Ok(()), }) { Ok(val) => val, Err(_) => { println!(" Invalid body. Skipping message"); return Ok(()); } };
// filter by did and reponame if let Some(repo_did) = body["event"]["repoDid"].as_str() && let Some(repo) = body["event"]["repoName"].as_str() && repo_did != &did_doc.did && repo != &config.repo_name { // repo doesnt match so skip return Ok(()); }
println!(" Executing `/bin/sh -c {}`", &config.shell);
// exec shell command in /bin/sh match Command::new("/bin/sh") .arg("-c") .arg(&config.shell) .output() { Ok(val) => val, Err(_) => return Ok(()), };
Ok(()) } }) { Ok(_) => {} Err(err) => println!(" Connection failed: {}", err), };
return Ok(());}