summaryrefslogtreecommitdiff
path: root/rola-cli/src/error/space.rs
blob: fb0a5609b265118f701bcf3ee067b58143bbfaca (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
use mingling::{
    Groupped,
    macros::{chain, r_println, renderer},
    res::ResExitCode,
};
use serde::Serialize;
use space_system::SpaceError;

use crate::{Next, error::ErrorIo, locale::errors::I18nSpaceError};

pub const EC_SPACE_NOT_FOUND: i32 = 2600;
pub const EC_SPACE_PATH_FORMAT: i32 = 2601;
pub const EC_SPACE_REQUIRE_EMPTY_DIR: i32 = 2602;
pub const EC_SPACE_CONFIG_ALREADY_EXIST: i32 = 2603;

#[derive(Serialize, Groupped)]
pub struct ErrorSpace {
    pub error: SpaceError,
}

#[chain]
pub fn handle_error_space(err: ErrorSpace) -> Next {
    match err.error {
        // Forward to ErrorIo
        SpaceError::Io(error) => ErrorIo::from(error).to_render(),

        _ => err.to_render(),
    }
}

#[renderer]
pub fn render_error_space(err: ErrorSpace, ec: &mut ResExitCode) {
    match &err.error {
        SpaceError::SpaceNotFound => {
            r_println!("{}", I18nSpaceError::space_not_found().trim());
            ec.exit_code = EC_SPACE_NOT_FOUND;
        }
        SpaceError::PathFormatError(_) => {
            r_println!("{}", I18nSpaceError::path_format().trim());
            ec.exit_code = EC_SPACE_PATH_FORMAT;
        }
        SpaceError::RequireEmptyDirectory => {
            r_println!("{}", I18nSpaceError::require_empty_directory().trim());
            ec.exit_code = EC_SPACE_REQUIRE_EMPTY_DIR;
        }
        SpaceError::ConfigFileAlreadyExist => {
            r_println!("{}", I18nSpaceError::config_file_already_exist().trim());
            ec.exit_code = EC_SPACE_CONFIG_ALREADY_EXIST;
        }
        SpaceError::Io(_) => {
            // Forwarded to ErrorIo via handle_error_space chain
        }
        SpaceError::Other(_) => {
            r_println!("{}", I18nSpaceError::space_not_found().trim());
            ec.exit_code = EC_SPACE_NOT_FOUND;
        }
    }
}

impl From<SpaceError> for ErrorSpace {
    fn from(error: SpaceError) -> Self {
        Self { error }
    }
}