Skip to main content

blockworx/doc_ng/
values.rs

1//! Shared value enums: the closed vocabularies entity registers draw from.
2//! Serde variant names are wire tags — never rename or repurpose a variant;
3//! deprecate and add instead. Rationale: `docs/doc-ng-design-notes.md`.
4
5use serde::{Deserialize, Serialize};
6
7#[derive(Clone, Copy, PartialEq, Eq, Default, Debug, Serialize, Deserialize)]
8pub enum LabelSide {
9    #[default]
10    Top,
11    Center,
12    Bottom,
13}
14
15/// The 9-accent palette; `Accent0` is the meaningful default ("plain").
16#[derive(Clone, Copy, PartialEq, Eq, Default, Debug, Serialize, Deserialize)]
17pub enum Role {
18    #[default]
19    Accent0,
20    Accent1,
21    Accent2,
22    Accent3,
23    Accent4,
24    Accent5,
25    Accent6,
26    Accent7,
27    Accent8,
28}
29
30#[derive(Clone, Copy, PartialEq, Eq, Default, Debug, Serialize, Deserialize)]
31pub enum PinDir {
32    #[default]
33    Input,
34    InOut,
35    Output,
36}
37
38#[cfg(test)]
39mod tests {
40    use super::*;
41
42    /// The zero-value model reads these defaults as its meaningful zeros;
43    /// changing one changes every default-initialized register.
44    #[test]
45    fn defaults_are_the_meaningful_zeros() {
46        assert_eq!(Role::default(), Role::Accent0);
47        assert_eq!(LabelSide::default(), LabelSide::Top);
48        assert_eq!(PinDir::default(), PinDir::Input);
49    }
50
51    /// Variant names are wire tags. This pins every one until the port's
52    /// golden-bytes tests take over (`docs/doc-ng-port-playbook.md`, step 11).
53    #[test]
54    fn serde_names_are_stable() {
55        fn name<T: Serialize>(value: &T) -> String {
56            serde_json::to_string(value).expect("value enums serialize infallibly")
57        }
58
59        let roles = [
60            Role::Accent0,
61            Role::Accent1,
62            Role::Accent2,
63            Role::Accent3,
64            Role::Accent4,
65            Role::Accent5,
66            Role::Accent6,
67            Role::Accent7,
68            Role::Accent8,
69        ];
70        for (i, role) in roles.into_iter().enumerate() {
71            assert_eq!(name(&role), format!("\"Accent{i}\""));
72        }
73
74        assert_eq!(name(&LabelSide::Top), "\"Top\"");
75        assert_eq!(name(&LabelSide::Center), "\"Center\"");
76        assert_eq!(name(&LabelSide::Bottom), "\"Bottom\"");
77
78        assert_eq!(name(&PinDir::Input), "\"Input\"");
79        assert_eq!(name(&PinDir::InOut), "\"InOut\"");
80        assert_eq!(name(&PinDir::Output), "\"Output\"");
81    }
82}