1use std::io;
2use thiserror::Error;
3
4pub type Result<T> = std::result::Result<T, Error>;
5
6#[derive(Error, Debug)]
7pub enum Error {
8 #[error("Runtime not found: {language} {version}")]
9 RuntimeNotFound { language: String, version: String },
10
11 #[error("Network error: {0}")]
12 Network(#[from] reqwest::Error),
13
14 #[error("IO error: {0}")]
15 Io(#[from] io::Error),
16
17 #[error("Integrity check failed: expected {expected}, got {actual}")]
18 IntegrityCheckFailed { expected: String, actual: String },
19
20 #[error("JSON parsing error: {0}")]
21 JsonError(#[from] serde_json::Error),
22
23 #[error("Invalid language: {0}")]
24 InvalidLanguage(String),
25
26 #[error("Manifest not found for {language}")]
27 ManifestNotFound { language: String },
28
29 #[error("Version {version} not found for {language}")]
30 VersionNotFound { language: String, version: String },
31
32 #[error("{0}")]
33 Other(String),
34}
35
36impl From<String> for Error {
37 fn from(s: String) -> Self {
38 Error::InvalidLanguage(s)
39 }
40}
41
42#[cfg(test)]
43mod tests {
44 use super::*;
45
46 #[test]
47 fn test_error_display() {
48 let err = Error::RuntimeNotFound {
49 language: "python".to_string(),
50 version: "3.11.7".to_string(),
51 };
52 assert_eq!(err.to_string(), "Runtime not found: python 3.11.7");
53
54 let err = Error::IntegrityCheckFailed {
55 expected: "abc123".to_string(),
56 actual: "def456".to_string(),
57 };
58 assert_eq!(
59 err.to_string(),
60 "Integrity check failed: expected abc123, got def456"
61 );
62
63 let err = Error::InvalidLanguage("foo".to_string());
64 assert_eq!(err.to_string(), "Invalid language: foo");
65 }
66
67 #[test]
68 fn test_error_from_string() {
69 let err: Error = "unknown language".to_string().into();
70 assert_eq!(err.to_string(), "Invalid language: unknown language");
71 }
72}