1use thiserror::Error;
10
11#[derive(Error, Debug)]
12pub enum ActrCliError {
13 #[error("IO operation failed: {0}")]
15 Io(#[from] std::io::Error),
16
17 #[error("Network request failed: {0}")]
18 Network(#[from] reqwest::Error),
19
20 #[error("JSON serialization failed: {0}")]
21 Serialization(#[from] serde_json::Error),
22
23 #[error("Git operation failed: {0}")]
24 Git(#[from] git2::Error),
25
26 #[error("Configuration error: {0}")]
28 Configuration(String),
29
30 #[error("Invalid project structure: {0}")]
31 InvalidProject(String),
32
33 #[error("Project already exists: {0}")]
34 ProjectExists(String),
35
36 #[error("Dependency resolution failed: {0}")]
38 Dependency(String),
39
40 #[error("Build process failed: {0}")]
41 Build(String),
42
43 #[error("Code generation failed: {0}")]
44 CodeGeneration(String),
45
46 #[error("Template rendering failed: {0}")]
48 Template(#[from] handlebars::RenderError),
49
50 #[error("Unsupported feature: {0}")]
51 Unsupported(String),
52
53 #[error("Command execution failed: {0}")]
55 Command(String),
56
57 #[error("Actor framework error: {0}")]
59 Actor(#[from] actr_protocol::ActrError),
60
61 #[error("URI parsing error: {0}")]
62 UriParsing(#[from] actr_protocol::uri::ActrUriError),
63
64 #[error("Configuration parsing error: {0}")]
65 ConfigParsing(#[from] actr_config::ConfigError),
66
67 #[error("Internal error: {0}")]
69 Internal(#[from] anyhow::Error),
70}
71
72impl ActrCliError {
74 pub fn config_error(msg: impl Into<String>) -> Self {
76 Self::Configuration(msg.into())
77 }
78
79 pub fn dependency_error(msg: impl Into<String>) -> Self {
81 Self::Dependency(msg.into())
82 }
83
84 pub fn build_error(msg: impl Into<String>) -> Self {
86 Self::Build(msg.into())
87 }
88
89 pub fn command_error(msg: impl Into<String>) -> Self {
91 Self::Command(msg.into())
92 }
93
94 pub fn is_config_error(&self) -> bool {
96 matches!(
97 self,
98 Self::Configuration(_) | Self::ConfigParsing(_) | Self::InvalidProject(_)
99 )
100 }
101
102 pub fn is_network_error(&self) -> bool {
104 matches!(self, Self::Network(_))
105 }
106
107 pub fn user_hint(&self) -> Option<&str> {
109 match self {
110 Self::InvalidProject(_) => Some("💡 Use 'actr init' to initialize a new project"),
111 Self::ProjectExists(_) => Some("💡 Use --force to overwrite existing project"),
112 Self::Configuration(_) => Some("💡 Check your Actr.toml configuration file"),
113 Self::Dependency(_) => Some("💡 Try 'actr install --force' to refresh dependencies"),
114 Self::Build(_) => Some("💡 Check proto files and dependencies"),
115 Self::Network(_) => Some("💡 Check your network connection and proxy settings"),
116 Self::Unsupported(_) => Some("💡 This feature is not implemented yet"),
117 _ => None,
118 }
119 }
120}
121
122pub type Result<T> = std::result::Result<T, ActrCliError>;
124
125