1use std::time::Duration;
2
3use thiserror::Error;
4
5pub type MultiModalResult<T> = Result<T, MultiModalError>;
6
7#[derive(Debug, Error)]
8pub enum MediaConnectorError {
9 #[error("unsupported media scheme: {0}")]
10 UnsupportedScheme(String),
11 #[error("invalid media URL: {0}")]
12 InvalidUrl(String),
13 #[error("media domain '{0}' is not in the allow list")]
14 DisallowedDomain(String),
15 #[error("local media path is not allowed: {0}")]
16 DisallowedLocalPath(String),
17 #[error("HTTP error while fetching media: {0}")]
18 Http(#[from] reqwest::Error),
19 #[error("I/O error while reading media: {0}")]
20 Io(#[from] std::io::Error),
21 #[error("base64 decode error: {0}")]
22 Base64Decode(#[from] base64::DecodeError),
23 #[error("data URL parse error: {0}")]
24 DataUrl(String),
25 #[error("media decode task failed: {0}")]
26 Blocking(#[from] tokio::task::JoinError),
27 #[error("image decode error: {0}")]
28 Image(#[from] image::ImageError),
29 #[error("media fetch timed out after {0:?}")]
30 Timeout(Duration),
31}
32
33#[derive(Debug, Error)]
34pub enum MultiModalError {
35 #[error(transparent)]
36 Media(#[from] MediaConnectorError),
37 #[error("unsupported content part: {0}")]
38 UnsupportedContent(&'static str),
39 #[error("tracker task join error: {0}")]
40 Join(#[from] tokio::task::JoinError),
41 #[error("tracker validation error: {0}")]
42 Validation(String),
43}