use std::time::Duration;
use reqwest::StatusCode;
#[derive(Debug, thiserror::Error)]
#[non_exhaustive]
pub enum Error {
#[error("GoHighLevel API error ({status}): {message}")]
Api {
status: StatusCode,
message: String,
request_id: Option<String>,
},
#[error("rate limited by GoHighLevel API{}", retry_after_hint(.retry_after))]
RateLimited {
retry_after: Option<Duration>,
},
#[error("authentication error: {0}")]
Auth(String),
#[error("transport error: {0}")]
Transport(#[from] reqwest::Error),
#[error("failed to decode response from `{endpoint}`: {source}")]
Decode {
endpoint: String,
#[source]
source: serde_json::Error,
},
#[error("configuration error: {0}")]
Config(String),
}
fn retry_after_hint(retry_after: &Option<Duration>) -> String {
match retry_after {
Some(d) => format!(" (retry after {}s)", d.as_secs()),
None => String::new(),
}
}
pub type Result<T, E = Error> = std::result::Result<T, E>;