1#[derive(thiserror::Error, Debug)]
5pub enum PackageError {
6 #[error("failed to read .aion ZIP archive: {0}")]
8 ArchiveRead(#[from] zip::result::ZipError),
9
10 #[error("missing required manifest.json entry")]
12 MissingManifest,
13
14 #[error(
16 "module `{module}` uses an engine-reserved namespace and must not ship as package bytecode"
17 )]
18 ReservedModuleName {
19 module: String,
21 },
22
23 #[error("failed to write .aion ZIP archive: {0}")]
25 ArchiveWrite(zip::result::ZipError),
26
27 #[error("failed to write .aion archive bytes: {source}")]
29 ArchiveWriteIo {
30 source: std::io::Error,
32 },
33
34 #[error("failed to parse manifest.json: {source}")]
36 ManifestParse {
37 source: serde_json::Error,
39 },
40
41 #[error("failed to serialise manifest.json: {source}")]
43 ManifestSerialise {
44 source: serde_json::Error,
46 },
47
48 #[error("unknown .aion format_version {found}")]
50 UnknownFormatVersion {
51 found: u32,
53 },
54
55 #[error("missing entry module `{module}` in beam set")]
57 MissingEntryModule {
58 module: String,
60 },
61
62 #[error("package integrity mismatch: expected version `{expected}`, computed `{computed}`")]
64 IntegrityMismatch {
65 expected: String,
67 computed: String,
69 },
70
71 #[error("malformed beam entry `{entry}`")]
73 MalformedBeamEntry {
74 entry: String,
76 },
77
78 #[error(
80 "archive contents inflate past the extraction limit of {limit} bytes; refusing to extract further"
81 )]
82 InflatedSizeExceeded {
83 limit: u64,
85 },
86
87 #[error(
90 "explicit-timeout package identity requires an authored workflow timeout, but the manifest declares none"
91 )]
92 ExplicitTimeoutWithoutValue,
93}
94
95#[cfg(test)]
96mod tests {
97 use super::PackageError;
98
99 fn assert_send_sync<T: Send + Sync>() {}
100
101 #[test]
102 fn package_error_is_send_and_sync() {
103 assert_send_sync::<PackageError>();
104 }
105
106 #[test]
107 fn display_messages_name_the_failed_condition() {
108 assert_eq!(
109 PackageError::MissingManifest.to_string(),
110 "missing required manifest.json entry"
111 );
112 assert_eq!(
113 PackageError::ArchiveWriteIo {
114 source: std::io::Error::other("disk full"),
115 }
116 .to_string(),
117 "failed to write .aion archive bytes: disk full"
118 );
119 assert_eq!(
120 PackageError::UnknownFormatVersion { found: 99 }.to_string(),
121 "unknown .aion format_version 99"
122 );
123 assert_eq!(
124 PackageError::MissingEntryModule {
125 module: "workflow/main".to_owned(),
126 }
127 .to_string(),
128 "missing entry module `workflow/main` in beam set"
129 );
130 assert_eq!(
131 PackageError::IntegrityMismatch {
132 expected: "expected".to_owned(),
133 computed: "computed".to_owned(),
134 }
135 .to_string(),
136 "package integrity mismatch: expected version `expected`, computed `computed`"
137 );
138 assert_eq!(
139 PackageError::MalformedBeamEntry {
140 entry: "beam/workflow.beam".to_owned(),
141 }
142 .to_string(),
143 "malformed beam entry `beam/workflow.beam`"
144 );
145 assert_eq!(
146 PackageError::InflatedSizeExceeded { limit: 1024 }.to_string(),
147 "archive contents inflate past the extraction limit of 1024 bytes; refusing to extract further"
148 );
149 }
150}