#[cfg(any(feature = "serde-json", feature = "serde-wasm-bindgen"))]
use crate::browser::json;
use crate::util::window;
use std::convert::TryInto;
use wasm_bindgen_futures::JsFuture;
pub mod form_data;
pub mod header;
mod method;
mod request;
mod response;
mod status;
pub use form_data::FormData;
pub use header::{Header, Headers};
pub use json::Error as JsonError;
pub use method::*;
pub use request::*;
pub use response::*;
pub use status::*;
pub type Result<T> = std::result::Result<T, FetchError>;
pub async fn fetch<'a>(request: impl Into<Request<'a>>) -> Result<Response> {
let request = request.into();
let promise = window().fetch_with_request(&request.try_into()?);
let raw_response = JsFuture::from(promise)
.await
.map(Into::into)
.map_err(FetchError::NetworkError)?;
Ok(Response { raw_response })
}
#[allow(clippy::module_name_repetitions)]
#[derive(Debug)]
pub enum FetchError {
#[cfg(any(feature = "serde-json", feature = "serde-wasm-bindgen"))]
JsonError(JsonError),
DomException(web_sys::DomException),
PromiseError(wasm_bindgen::JsValue),
NetworkError(wasm_bindgen::JsValue),
RequestError(wasm_bindgen::JsValue),
StatusError(Status),
}
#[cfg(any(feature = "serde-json", feature = "serde-wasm-bindgen"))]
impl From<json::Error> for FetchError {
fn from(v: json::Error) -> Self {
Self::JsonError(v)
}
}
#[cfg(test)]
mod tests {
use wasm_bindgen_test::*;
wasm_bindgen_test_configure!(run_in_browser);
use super::*;
use crate::browser::Url;
#[wasm_bindgen_test]
fn test_fetch_args() {
let _ = fetch("https://seed-rs.org");
let _ = fetch(String::from("https://seed-rs.org"));
let _ = fetch(Url::new().set_path(&["/", "foo"]));
let _ = fetch(Request::new("https://seed-rs.org"));
}
}