caravel/
module.rs

1// wip
2
3use crate::transport::{Event, EventType, File, Manifest, QueryType};
4use anyhow::Result;
5use std::process::exit;
6
7fn run_module() -> Result<()> {
8    // Read the input from only arg
9    let args: Vec<String> = std::env::args().collect();
10    if args.len() != 2 {
11        let error_event = Event {
12            class: EventType::Error("Invalid number of arguments".to_string()),
13        };
14        error_event.write_to_stderr()?;
15        exit(1)
16    }
17
18    // The first arg is the program name, we need the second one
19    let data = &args[1];
20
21    // print a sample apply event to stdout
22    let apply_event = Event {
23        class: EventType::Apply(Manifest {
24            resources: vec![Box::new(File {
25                name: "test.txt".to_string(),
26                content: "Hello, World!".to_string(),
27            })],
28        }),
29    };
30    println!("{}", serde_json::to_string(&apply_event)?);
31
32    // data is a valid UTF-8 string
33    // now we need to deserialize it
34    let recv_event: Event = match serde_json::from_str(&data) {
35        Ok(event) => event,
36        Err(_) => {
37            let error_event = Event {
38                class: EventType::Error("Invalid event".to_string()),
39            };
40            error_event.write_to_stderr()?;
41            exit(1)
42        }
43    };
44
45    // Now we have a valid event, do something with it
46    let reply_event = match recv_event.class {
47        EventType::Query(QueryType::Health) => Event {
48            class: EventType::Reply("OK".to_string()),
49        },
50
51        EventType::Query(QueryType::Features) => Event {
52            class: EventType::Reply("Feature 1, Feature 2".to_string()),
53        },
54
55        EventType::Apply(manifest) => {
56            manifest.resources.iter().for_each(|r| {
57                if let Err(e) = r.apply() {
58                    let error_event = Event {
59                        class: EventType::Error(format!("Error applying resource: {}", e)),
60                    };
61                    error_event.write_to_stderr().unwrap();
62                    exit(1);
63                }
64            });
65            Event {
66                class: EventType::Reply("Applied Manifest".to_string()),
67            }
68        }
69
70        _ => Event {
71            class: EventType::Error("Invalid event type".to_string()),
72        },
73    };
74
75    reply_event.write_to_stdout()?;
76
77    Ok(())
78}