entrenar/sovereign/distribution/
format.rs1use serde::{Deserialize, Serialize};
4
5#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, Default)]
7pub enum DistributionFormat {
8 Iso,
10 Oci,
12 Nix,
14 Flatpak,
16 #[default]
18 Tarball,
19}
20
21impl DistributionFormat {
22 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 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}