Skip to main content

rsiot/components/cmp_http_server/
error.rs

1use std::io::Error as StdIoError;
2
3use axum::{http::StatusCode, response::IntoResponse};
4
5use crate::executor::ComponentError;
6
7use super::COMPONENT_NAME;
8
9#[allow(missing_docs)]
10#[derive(Debug, thiserror::Error)]
11pub enum Error {
12    /// Ошибка Axum
13    #[error(transparent)]
14    AxumServe(StdIoError),
15
16    /// Ошибка привязки к порту
17    #[error(transparent)]
18    BindPort(StdIoError),
19
20    #[error("Unknown path: {0}")]
21    UnknownPath(String),
22
23    #[error("Not configured: {0}")]
24    NotConfigured(String),
25
26    #[error(transparent)]
27    Message(#[from] crate::message::Error),
28
29    #[error(transparent)]
30    FnInput(anyhow::Error),
31
32    #[error(transparent)]
33    FnOutput(anyhow::Error),
34
35    #[error("HeaderParseError: {0}")]
36    InvalidHeaderValue(axum::http::header::InvalidHeaderValue),
37
38    #[error(transparent)]
39    CmpOutput(#[from] crate::executor::ComponentError),
40
41    #[error("TaskEndAxumServe")]
42    TaskEndAxumServe,
43
44    #[error("TaskEndCmpPlcInput")]
45    TaskEndCmpPlcInput,
46
47    #[error("TaskEndCmpPlcOutput")]
48    TaskEndCmpPlcOutput,
49
50    #[error("TaskEndCmpPlcStatic")]
51    TaskEndCmpPlcStatic,
52
53    #[error("UpdateGetEndpoints")]
54    TaskUpdateGetEndpoints,
55
56    #[error(transparent)]
57    Serde(#[from] crate::serde_utils::Error),
58
59    #[error("{COMPONENT_NAME} | TokioTaskJoin: {0}")]
60    TokioTaskJoin(#[from] tokio::task::JoinError),
61}
62
63/// Преобразование ошибки в понятный пользователю ответ
64impl IntoResponse for Error {
65    fn into_response(self) -> axum::response::Response {
66        let body = self.to_string();
67        (StatusCode::INTERNAL_SERVER_ERROR, body).into_response()
68    }
69}
70
71impl From<Error> for ComponentError {
72    fn from(value: Error) -> Self {
73        ComponentError::Execution(value.to_string())
74    }
75}