1use std::path::PathBuf;
4
5use thiserror::Error;
6
7#[derive(Error, Debug)]
8pub enum Error {
9 #[error("IO error")]
10 Io(#[from] std::io::Error),
11
12 #[error("TOML parse error in {context}")]
13 Toml {
14 #[source]
15 error: toml::de::Error,
16 context: String,
17 },
18
19 #[error("TOML serialize error")]
20 TomlSerialize(#[from] toml::ser::Error),
21
22 #[error("Package not found: {name}")]
23 PackageNotFound { name: String, available: String },
24
25 #[error("Invalid package name: {0}")]
26 InvalidPackageName(String),
27
28 #[error("Invalid language: {lang}. Supported languages: js, ts, python, go, rust")]
29 InvalidLanguage { lang: String },
30
31 #[error("Circular dependency detected: {0}. Use 'polykit graph' to visualize dependencies.")]
32 CircularDependency(String),
33
34 #[error("Config file not found. Expected 'polykit.toml' in package directory.")]
35 ConfigNotFound(PathBuf),
36
37 #[error("Adapter error for {package}: {message}")]
38 Adapter { package: String, message: String },
39
40 #[error("Graph error: {0}")]
41 Graph(String),
42
43 #[error("Task execution failed for {package}::{task}")]
44 TaskExecution {
45 package: String,
46 task: String,
47 message: String,
48 },
49
50 #[error("Release error: {0}")]
51 Release(String),
52
53 #[error("Mutex lock error")]
54 MutexLock(String),
55}
56
57impl From<toml::de::Error> for Error {
58 fn from(error: toml::de::Error) -> Self {
59 Error::Toml {
60 error,
61 context: "polykit.toml".to_string(),
62 }
63 }
64}
65
66pub type Result<T> = std::result::Result<T, Error>;