1use anyhow::Error;
2
3use crate::client::MoldClient;
4
5#[derive(Debug, Clone, Copy, PartialEq, Eq)]
6pub enum ServerAvailability {
7 FallbackLocal,
8 SurfaceError,
9}
10
11#[derive(Debug, Clone, Copy, PartialEq, Eq)]
12pub enum GenerateServerAction {
13 PullModelAndRetry,
14 FallbackLocal,
15 SurfaceError,
16}
17
18pub fn classify_server_error(err: &Error) -> ServerAvailability {
19 if MoldClient::is_connection_error(err) {
20 ServerAvailability::FallbackLocal
21 } else {
22 ServerAvailability::SurfaceError
23 }
24}
25
26pub fn classify_generate_error(err: &Error) -> GenerateServerAction {
27 if MoldClient::is_model_not_found(err) {
28 GenerateServerAction::PullModelAndRetry
29 } else if MoldClient::is_connection_error(err) {
30 GenerateServerAction::FallbackLocal
31 } else {
32 GenerateServerAction::SurfaceError
33 }
34}
35
36#[cfg(test)]
37mod tests {
38 use super::*;
39 use crate::error::MoldError;
40
41 #[test]
42 fn classify_server_error_connection_falls_back_local() {
43 let err = anyhow::Error::new(MoldError::Client("connect failed".into()));
44 assert_eq!(
45 classify_server_error(&err),
46 ServerAvailability::FallbackLocal
47 );
48 }
49
50 #[test]
51 fn classify_server_error_non_connection_surfaces() {
52 let err = anyhow::anyhow!("boom");
53 assert_eq!(
54 classify_server_error(&err),
55 ServerAvailability::SurfaceError
56 );
57 }
58
59 #[test]
60 fn classify_generate_error_model_missing_pulls_and_retries() {
61 let err = anyhow::Error::new(MoldError::ModelNotFound("missing".into()));
62 assert_eq!(
63 classify_generate_error(&err),
64 GenerateServerAction::PullModelAndRetry
65 );
66 }
67
68 #[test]
69 fn classify_generate_error_connection_falls_back_local() {
70 let err = anyhow::Error::new(MoldError::Client("connect failed".into()));
71 assert_eq!(
72 classify_generate_error(&err),
73 GenerateServerAction::FallbackLocal
74 );
75 }
76
77 #[test]
78 fn classify_generate_error_other_surfaces() {
79 let err = anyhow::anyhow!("boom");
80 assert_eq!(
81 classify_generate_error(&err),
82 GenerateServerAction::SurfaceError
83 );
84 }
85}