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 for ErrorSpace { fn from(error: SpaceError) -> Self { Self { error } } }