Skip to main content

light_fw_cli_core/
error.rs

1use thiserror::Error;
2
3/// Ошибки CLI-операций `light`.
4#[derive(Debug, Error)]
5pub enum Error {
6    /// Ошибка ввода-вывода.
7    #[error("IO error: {0}")]
8    Io(#[from] std::io::Error),
9
10    /// Ошибка разбора TOML.
11    #[error("TOML parse error: {0}")]
12    Toml(#[from] toml_edit::TomlError),
13
14    /// Ошибка сериализации TOML.
15    #[error("TOML serialize error: {0}")]
16    TomlSer(#[from] toml_edit::ser::Error),
17
18    /// Ошибка JSON.
19    #[error("JSON error: {0}")]
20    Json(#[from] serde_json::Error),
21
22    /// Ошибка разбора semver-версии или диапазона.
23    #[error("Semver error: {0}")]
24    Semver(#[from] semver::Error),
25
26    /// Ошибка обхода каталога.
27    #[error("Walkdir error: {0}")]
28    Walkdir(#[from] walkdir::Error),
29
30    /// Ошибка чтения `.gitignore`/`.ignore`.
31    #[error("Ignore error: {0}")]
32    Ignore(#[from] ignore::Error),
33
34    /// Ошибка разбора HTML-шаблона.
35    #[error("Template parse error: {0}")]
36    TemplateParse(String),
37
38    /// Ошибка манифеста компонента.
39    #[error("Manifest error: {0}")]
40    Manifest(String),
41
42    /// Внешний процесс завершился с ненулевым кодом.
43    #[error("команда `{program}` завершилась с кодом {code}: {stderr}")]
44    CommandFailed {
45        /// Имя запущенной программы.
46        program: String,
47        /// Код возврата.
48        code: i32,
49        /// Вывод в stderr.
50        stderr: String,
51    },
52
53    /// Исполняемый файл не найден в `PATH`.
54    #[error("команда `{0}` не найдена (установлен ли инструмент?)")]
55    CommandNotFound(String),
56
57    /// Компонент не найден ни в workspace, ни в vendor, ни в реестре.
58    #[error("компонент `{0}` не найден")]
59    ComponentNotFound(String),
60
61    /// Имя не относится к компонентам Light (не `light-fw-*`).
62    #[error("`{0}` не является компонентом Light: имя должно начинаться с `light-fw-`")]
63    NotComponent(String),
64
65    /// Компонент несовместим с текущим ядром проекта или другими компонентами.
66    #[error("компонент `{component}` несовместим: {reason}")]
67    Incompatible {
68        /// Имя компонента.
69        component: String,
70        /// Причина несовместимости.
71        reason: String,
72    },
73
74    /// Компонент не подключён к проекту.
75    #[error("компонент `{0}` не установлен")]
76    NotInstalled(String),
77
78    /// Конфликт между компонентами (`conflicts`).
79    #[error("конфликт компонентов: {0}")]
80    Conflict(String),
81
82    /// От него зависят другие компоненты.
83    #[error("от компонента `{0}` зависят другие компоненты — удалите их вместе")]
84    InUse(String),
85
86    /// Операция отменена пользователем.
87    #[error("операция отменена")]
88    Aborted,
89
90    /// Требуется сеть, но включён `--offline`.
91    #[error(
92        "компонент `{0}` не найден в vendor/, установите его без `--offline` на машине с сетью"
93    )]
94    Offline(String),
95
96    /// Ошибка работы с `light.lock`.
97    #[error("ошибка light.lock: {0}")]
98    Lockfile(String),
99
100    /// Ошибка резервного копирования/восстановления.
101    #[error("ошибка резервной копии: {0}")]
102    Backup(String),
103
104    /// Ошибка публикации: граф зависимостей, версии, pre-flight.
105    #[error("ошибка публикации: {0}")]
106    Publish(String),
107
108    /// Ошибка создания проекта (`light init`).
109    #[error("ошибка init: {0}")]
110    Init(String),
111
112    /// Версия крейта уже опубликована на crates.io.
113    #[error(
114        "crate {name} v{version} already published; bump version in Cargo.toml before publishing"
115    )]
116    AlreadyPublished {
117        /// Имя крейта.
118        name: String,
119        /// Уже опубликованная версия.
120        version: String,
121    },
122
123    /// Сетевой запрос к crates.io завершился ошибкой.
124    #[cfg(feature = "network")]
125    #[error("сетевой запрос не удался: {0}")]
126    Http(#[from] reqwest::Error),
127}
128
129/// Результат CLI-операции с [`enum@Error`].
130pub type Result<T> = std::result::Result<T, Error>;