Listen to git commits for a specific repo and run a shell command
1use std::process::Command;
2
3mod args;
4mod did;
5mod knot;
6
7fn main() -> Result<(), ()> {
8 // load configuration
9 let config = match args::load_config() {
10 Ok(res) => res,
11 Err(_) => return Err(()),
12 };
13
14 // resolve handle to did
15 println!("Resolving {}", config.handle);
16 let did_doc = match did::get_did(&config.handle) {
17 Ok(res) => res,
18 Err(_) => return Err(()),
19 };
20 println!(
21 " Found DID `{0}` hosted at `{1}`",
22 did_doc.did, did_doc.pds
23 );
24
25 // resolve did+repoName to knotserver
26 println!("Resolving @{0}/{1}", config.handle, config.repo_name);
27 let knot_server = match knot::find_knot(&did_doc.did, &config.repo_name, &did_doc.pds) {
28 Ok(val) => val,
29 Err(_) => return Err(()),
30 };
31 println!(" Found knot `{}`", knot_server);
32
33 // connect to /events on knotserver
34 println!(
35 "Connecting to `{}`",
36 format!("wss://{}/events", knot_server)
37 );
38
39 match ws::connect(format!("ws://{}/events", knot_server), |_out| {
40 println!(" Connection successful");
41 |msg: ws::Message| {
42 // parse json
43 let body = match json::parse(match msg.as_text() {
44 Ok(val) => val,
45 Err(_) => return Ok(()),
46 }) {
47 Ok(val) => val,
48 Err(_) => {
49 println!(" Invalid body. Skipping message");
50 return Ok(());
51 }
52 };
53
54 // filter by did and reponame
55 if let Some(repo_did) = body["event"]["repoDid"].as_str()
56 && let Some(repo) = body["event"]["repoName"].as_str()
57 && repo_did != &did_doc.did
58 && repo != &config.repo_name
59 {
60 // repo doesnt match so skip
61 return Ok(());
62 }
63
64 println!(" Executing `/bin/sh -c {}`", &config.shell);
65
66 // exec shell command in /bin/sh
67 match Command::new("/bin/sh")
68 .arg("-c")
69 .arg(&config.shell)
70 .output()
71 {
72 Ok(val) => val,
73 Err(_) => return Ok(()),
74 };
75
76 Ok(())
77 }
78 }) {
79 Ok(_) => {}
80 Err(err) => println!(" Connection failed: {}", err),
81 };
82
83 return Ok(());
84}