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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
use thiserror::Error;
/// Ошибки CLI-операций `light`.
#[derive(Debug, Error)]
pub enum Error {
/// Ошибка ввода-вывода.
#[error("IO error: {0}")]
Io(#[from] std::io::Error),
/// Ошибка разбора TOML.
#[error("TOML parse error: {0}")]
Toml(#[from] toml_edit::TomlError),
/// Ошибка сериализации TOML.
#[error("TOML serialize error: {0}")]
TomlSer(#[from] toml_edit::ser::Error),
/// Ошибка JSON.
#[error("JSON error: {0}")]
Json(#[from] serde_json::Error),
/// Ошибка разбора semver-версии или диапазона.
#[error("Semver error: {0}")]
Semver(#[from] semver::Error),
/// Ошибка обхода каталога.
#[error("Walkdir error: {0}")]
Walkdir(#[from] walkdir::Error),
/// Ошибка чтения `.gitignore`/`.ignore`.
#[error("Ignore error: {0}")]
Ignore(#[from] ignore::Error),
/// Ошибка разбора HTML-шаблона.
#[error("Template parse error: {0}")]
TemplateParse(String),
/// Ошибка манифеста компонента.
#[error("Manifest error: {0}")]
Manifest(String),
/// Внешний процесс завершился с ненулевым кодом.
#[error("команда `{program}` завершилась с кодом {code}: {stderr}")]
CommandFailed {
/// Имя запущенной программы.
program: String,
/// Код возврата.
code: i32,
/// Вывод в stderr.
stderr: String,
},
/// Исполняемый файл не найден в `PATH`.
#[error("команда `{0}` не найдена (установлен ли инструмент?)")]
CommandNotFound(String),
/// Компонент не найден ни в workspace, ни в vendor, ни в реестре.
#[error("компонент `{0}` не найден")]
ComponentNotFound(String),
/// Имя не относится к компонентам Light (не `light-fw-*`).
#[error("`{0}` не является компонентом Light: имя должно начинаться с `light-fw-`")]
NotComponent(String),
/// Компонент несовместим с текущим ядром проекта или другими компонентами.
#[error("компонент `{component}` несовместим: {reason}")]
Incompatible {
/// Имя компонента.
component: String,
/// Причина несовместимости.
reason: String,
},
/// Компонент не подключён к проекту.
#[error("компонент `{0}` не установлен")]
NotInstalled(String),
/// Конфликт между компонентами (`conflicts`).
#[error("конфликт компонентов: {0}")]
Conflict(String),
/// От него зависят другие компоненты.
#[error("от компонента `{0}` зависят другие компоненты — удалите их вместе")]
InUse(String),
/// Операция отменена пользователем.
#[error("операция отменена")]
Aborted,
/// Требуется сеть, но включён `--offline`.
#[error(
"компонент `{0}` не найден в vendor/, установите его без `--offline` на машине с сетью"
)]
Offline(String),
/// Ошибка работы с `light.lock`.
#[error("ошибка light.lock: {0}")]
Lockfile(String),
/// Ошибка резервного копирования/восстановления.
#[error("ошибка резервной копии: {0}")]
Backup(String),
/// Ошибка публикации: граф зависимостей, версии, pre-flight.
#[error("ошибка публикации: {0}")]
Publish(String),
/// Ошибка создания проекта (`light init`).
#[error("ошибка init: {0}")]
Init(String),
/// Версия крейта уже опубликована на crates.io.
#[error(
"crate {name} v{version} already published; bump version in Cargo.toml before publishing"
)]
AlreadyPublished {
/// Имя крейта.
name: String,
/// Уже опубликованная версия.
version: String,
},
/// Сетевой запрос к crates.io завершился ошибкой.
#[cfg(feature = "network")]
#[error("сетевой запрос не удался: {0}")]
Http(#[from] reqwest::Error),
}
/// Результат CLI-операции с [`enum@Error`].
pub type Result<T> = std::result::Result<T, Error>;