1use std::time::Duration;
2
3use reqwest::StatusCode;
4
5#[derive(Debug, thiserror::Error)]
7#[non_exhaustive]
8pub enum Error {
9 #[error("GoHighLevel API error ({status}): {message}")]
11 Api {
12 status: StatusCode,
14 message: String,
16 request_id: Option<String>,
18 },
19
20 #[error("rate limited by GoHighLevel API{}", retry_after_hint(.retry_after))]
22 RateLimited {
23 retry_after: Option<Duration>,
25 },
26
27 #[error("authentication error: {0}")]
29 Auth(String),
30
31 #[error("transport error: {0}")]
33 Transport(#[from] reqwest::Error),
34
35 #[error("failed to decode response from `{endpoint}`: {source}")]
37 Decode {
38 endpoint: String,
40 #[source]
42 source: serde_json::Error,
43 },
44
45 #[error("configuration error: {0}")]
47 Config(String),
48}
49
50fn retry_after_hint(retry_after: &Option<Duration>) -> String {
51 match retry_after {
52 Some(d) => format!(" (retry after {}s)", d.as_secs()),
53 None => String::new(),
54 }
55}
56
57pub type Result<T, E = Error> = std::result::Result<T, E>;