kernel/event/record/
roadmap.rs1use serde::{Deserialize, Serialize};
10
11use crate::NodeId;
12use crate::locator::Locator;
13use crate::plan::StopCause;
14
15#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
25pub struct RoadmapMoved {
26 pub by: String,
27 pub node: NodeId,
28 #[serde(flatten)]
29 pub step: RoadmapStep,
30}
31
32#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
34#[serde(tag = "verb", rename_all = "snake_case")]
35pub enum RoadmapStep {
36 Claimed {
37 item: String,
38 },
39 Split {
40 children: Vec<String>,
41 },
42 Finished {
43 item: String,
44 evidence: Locator,
45 },
46 Released {
47 item: String,
48 why: StopCause,
49 line: String,
50 },
51 Blocked {
52 item: String,
53 why: StopCause,
54 line: String,
55 },
56}
57
58#[cfg(test)]
59#[allow(clippy::unwrap_used, reason = "test code")]
60mod tests {
61 use super::*;
62 use crate::event::Payload;
63
64 #[test]
67 fn a_roadmap_line_writes_the_keys_the_hand_written_map_wrote() {
68 let claimed = RoadmapMoved {
69 by: "lab/parser".to_owned(),
70 node: NodeId::parse("2.3").unwrap(),
71 step: RoadmapStep::Claimed {
72 item: "the lexer".to_owned(),
73 },
74 };
75 let blocked = RoadmapMoved {
76 by: "lab/parser".to_owned(),
77 node: NodeId::parse("2").unwrap(),
78 step: RoadmapStep::Blocked {
79 item: "the lexer".to_owned(),
80 why: StopCause::Stalled { repeats: 3 },
81 line: "stalled".to_owned(),
82 },
83 };
84 let bytes =
85 |record: &RoadmapMoved| serde_json::to_string(&Payload::of(record).unwrap()).unwrap();
86 assert_eq!(
87 (bytes(&claimed), bytes(&blocked)),
88 (
89 r#"{"by":"lab/parser","item":"the lexer","node":"2.3","verb":"claimed"}"#.to_owned(),
90 r#"{"by":"lab/parser","item":"the lexer","line":"stalled","node":"2","verb":"blocked","why":{"stalled":{"repeats":3}}}"#.to_owned(),
91 )
92 );
93 assert_eq!(
94 Payload::of(&claimed)
95 .unwrap()
96 .read::<RoadmapMoved>()
97 .unwrap(),
98 claimed
99 );
100 }
101}