Skip to main content

entrenar/sovereign/distribution/
format.rs

1//! Distribution format options
2
3use serde::{Deserialize, Serialize};
4
5/// Distribution format options
6#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, Default)]
7pub enum DistributionFormat {
8    /// Bootable ISO with NixOS
9    Iso,
10    /// OCI container image
11    Oci,
12    /// Nix flake
13    Nix,
14    /// Flatpak bundle
15    Flatpak,
16    /// Simple tar.gz
17    #[default]
18    Tarball,
19}
20
21impl DistributionFormat {
22    /// Get file extension for the format
23    pub fn extension(&self) -> &'static str {
24        match self {
25            Self::Iso => "iso",
26            Self::Oci => "tar",
27            Self::Nix => "nix",
28            Self::Flatpak => "flatpak",
29            Self::Tarball => "tar.gz",
30        }
31    }
32
33    /// Get MIME type for the format
34    pub fn mime_type(&self) -> &'static str {
35        match self {
36            Self::Iso => "application/x-iso9660-image",
37            Self::Oci => "application/vnd.oci.image.layer.v1.tar",
38            Self::Nix => "text/plain",
39            Self::Flatpak => "application/vnd.flatpak",
40            Self::Tarball => "application/gzip",
41        }
42    }
43}
44
45impl std::fmt::Display for DistributionFormat {
46    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
47        match self {
48            Self::Iso => write!(f, "ISO"),
49            Self::Oci => write!(f, "OCI"),
50            Self::Nix => write!(f, "Nix"),
51            Self::Flatpak => write!(f, "Flatpak"),
52            Self::Tarball => write!(f, "Tarball"),
53        }
54    }
55}
56
57#[cfg(test)]
58mod tests {
59    use super::*;
60
61    #[test]
62    fn test_distribution_format_default() {
63        assert_eq!(DistributionFormat::default(), DistributionFormat::Tarball);
64    }
65
66    #[test]
67    fn test_distribution_format_extension_iso() {
68        assert_eq!(DistributionFormat::Iso.extension(), "iso");
69    }
70
71    #[test]
72    fn test_distribution_format_extension_oci() {
73        assert_eq!(DistributionFormat::Oci.extension(), "tar");
74    }
75
76    #[test]
77    fn test_distribution_format_extension_nix() {
78        assert_eq!(DistributionFormat::Nix.extension(), "nix");
79    }
80
81    #[test]
82    fn test_distribution_format_extension_flatpak() {
83        assert_eq!(DistributionFormat::Flatpak.extension(), "flatpak");
84    }
85
86    #[test]
87    fn test_distribution_format_extension_tarball() {
88        assert_eq!(DistributionFormat::Tarball.extension(), "tar.gz");
89    }
90
91    #[test]
92    fn test_distribution_format_mime_type_iso() {
93        assert_eq!(DistributionFormat::Iso.mime_type(), "application/x-iso9660-image");
94    }
95
96    #[test]
97    fn test_distribution_format_mime_type_oci() {
98        assert_eq!(DistributionFormat::Oci.mime_type(), "application/vnd.oci.image.layer.v1.tar");
99    }
100
101    #[test]
102    fn test_distribution_format_mime_type_nix() {
103        assert_eq!(DistributionFormat::Nix.mime_type(), "text/plain");
104    }
105
106    #[test]
107    fn test_distribution_format_mime_type_flatpak() {
108        assert_eq!(DistributionFormat::Flatpak.mime_type(), "application/vnd.flatpak");
109    }
110
111    #[test]
112    fn test_distribution_format_mime_type_tarball() {
113        assert_eq!(DistributionFormat::Tarball.mime_type(), "application/gzip");
114    }
115
116    #[test]
117    fn test_distribution_format_display_iso() {
118        assert_eq!(DistributionFormat::Iso.to_string(), "ISO");
119    }
120
121    #[test]
122    fn test_distribution_format_display_oci() {
123        assert_eq!(DistributionFormat::Oci.to_string(), "OCI");
124    }
125
126    #[test]
127    fn test_distribution_format_display_nix() {
128        assert_eq!(DistributionFormat::Nix.to_string(), "Nix");
129    }
130
131    #[test]
132    fn test_distribution_format_display_flatpak() {
133        assert_eq!(DistributionFormat::Flatpak.to_string(), "Flatpak");
134    }
135
136    #[test]
137    fn test_distribution_format_display_tarball() {
138        assert_eq!(DistributionFormat::Tarball.to_string(), "Tarball");
139    }
140
141    #[test]
142    fn test_distribution_format_clone() {
143        let fmt = DistributionFormat::Oci;
144        let cloned = fmt;
145        assert_eq!(fmt, cloned);
146    }
147
148    #[test]
149    fn test_distribution_format_hash() {
150        use std::collections::HashSet;
151        let mut set = HashSet::new();
152        set.insert(DistributionFormat::Iso);
153        set.insert(DistributionFormat::Iso);
154        assert_eq!(set.len(), 1);
155        set.insert(DistributionFormat::Oci);
156        assert_eq!(set.len(), 2);
157    }
158
159    #[test]
160    fn test_distribution_format_serde() {
161        let fmt = DistributionFormat::Flatpak;
162        let json = serde_json::to_string(&fmt).expect("JSON serialization should succeed");
163        let deserialized: DistributionFormat =
164            serde_json::from_str(&json).expect("JSON deserialization should succeed");
165        assert_eq!(fmt, deserialized);
166    }
167
168    #[test]
169    fn test_distribution_format_debug() {
170        assert_eq!(format!("{:?}", DistributionFormat::Iso), "Iso");
171        assert_eq!(format!("{:?}", DistributionFormat::Oci), "Oci");
172        assert_eq!(format!("{:?}", DistributionFormat::Nix), "Nix");
173        assert_eq!(format!("{:?}", DistributionFormat::Flatpak), "Flatpak");
174        assert_eq!(format!("{:?}", DistributionFormat::Tarball), "Tarball");
175    }
176
177    #[test]
178    fn test_distribution_format_eq() {
179        assert_eq!(DistributionFormat::Iso, DistributionFormat::Iso);
180        assert_ne!(DistributionFormat::Iso, DistributionFormat::Oci);
181    }
182}