#![doc(hidden)]
use crate::client::OpenFIGIClient;
use crate::error::{OpenFIGIError, Result};
use reqwest::Method;
use serde::Serialize;
pub(crate) struct OpenFIGIRequestBuilder {
client: OpenFIGIClient,
method: Method,
path: String,
body: Option<serde_json::Value>,
}
impl OpenFIGIRequestBuilder {
pub(crate) fn new(client: OpenFIGIClient, method: Method, path: impl Into<String>) -> Self {
Self {
client,
method,
path: path.into(),
body: None,
}
}
pub(crate) fn body<T: Serialize>(mut self, body: &T) -> Self {
self.body = Some(serde_json::to_value(body).expect("Failed to serialize body"));
self
}
pub(crate) async fn send(self) -> Result<reqwest::Response> {
let url = self
.client
.base_url()
.join(&self.path)
.map_err(OpenFIGIError::from)?;
let mut request_builder = self.client.client().request(self.method, url);
if let Some(body) = self.body {
request_builder = request_builder.json(&body);
}
if let Some(api_key) = self.client.api_key() {
request_builder = request_builder.header("X-OPENFIGI-APIKEY", api_key);
}
request_builder.send().await.map_err(OpenFIGIError::from)
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::client::OpenFIGIClient;
use reqwest::Method;
use serde_json::json;
impl OpenFIGIRequestBuilder {
fn method(&self) -> &Method {
&self.method
}
fn path(&self) -> &str {
&self.path
}
fn has_body(&self) -> bool {
self.body.is_some()
}
}
fn create_test_client() -> OpenFIGIClient {
OpenFIGIClient::new()
}
#[test]
fn test_request_builder_creation() {
let client = create_test_client();
let builder = OpenFIGIRequestBuilder::new(client, Method::GET, "test");
assert_eq!(builder.method(), &Method::GET);
assert_eq!(builder.path(), "test");
assert!(!builder.has_body());
}
#[test]
fn test_request_builder_body() {
let client = create_test_client();
let test_data = json!({"key": "value"});
let builder = OpenFIGIRequestBuilder::new(client, Method::POST, "test").body(&test_data);
assert!(builder.has_body());
}
#[test]
fn test_request_builder_getters() {
let client = create_test_client();
let builder = OpenFIGIRequestBuilder::new(client.clone(), Method::PUT, "api/test");
assert_eq!(builder.method(), &Method::PUT);
assert_eq!(builder.path(), "api/test");
}
#[test]
fn test_request_builder_chaining() {
let client = create_test_client();
let test_data = json!({"test": true});
let builder = OpenFIGIRequestBuilder::new(client, Method::POST, "test").body(&test_data);
assert_eq!(builder.method(), &Method::POST);
assert_eq!(builder.path(), "test");
assert!(builder.has_body());
}
}