use std::future::Future;
use crate::error::ApiError;
use crate::sse::SseStream;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum Method {
GET,
POST,
PUT,
DELETE,
PATCH,
HEAD,
OPTIONS,
}
impl Method {
pub fn as_reqwest(&self) -> reqwest::Method {
match self {
Self::GET => reqwest::Method::GET,
Self::POST => reqwest::Method::POST,
Self::PUT => reqwest::Method::PUT,
Self::DELETE => reqwest::Method::DELETE,
Self::PATCH => reqwest::Method::PATCH,
Self::HEAD => reqwest::Method::HEAD,
Self::OPTIONS => reqwest::Method::OPTIONS,
}
}
}
pub trait ApiClient: Send + Sync {
fn request(
&self,
method: Method,
path: &str,
query: Option<&str>,
body: Option<String>,
) -> impl Future<Output = Result<reqwest::Response, ApiError>> + Send;
fn request_stream(
&self,
method: Method,
path: &str,
query: Option<&str>,
) -> impl Future<Output = Result<SseStream, ApiError>> + Send;
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn method_conversions_and_traits() {
assert_eq!(Method::GET.as_reqwest(), reqwest::Method::GET);
assert_eq!(Method::POST.as_reqwest(), reqwest::Method::POST);
assert_eq!(Method::PUT.as_reqwest(), reqwest::Method::PUT);
assert_eq!(Method::DELETE.as_reqwest(), reqwest::Method::DELETE);
assert_eq!(Method::PATCH.as_reqwest(), reqwest::Method::PATCH);
assert_eq!(Method::HEAD.as_reqwest(), reqwest::Method::HEAD);
assert_eq!(Method::OPTIONS.as_reqwest(), reqwest::Method::OPTIONS);
assert_eq!(format!("{:?}", Method::GET), "GET");
assert_eq!(Method::GET, Method::GET);
assert_ne!(Method::GET, Method::POST);
let m = Method::PUT;
let m2 = m;
assert_eq!(m, m2);
}
}