Skip to main content

mold_core/
control.rs

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}