use std::fmt;
use std::sync::atomic::{AtomicU64, Ordering};
use bevy_ecs::resource::Resource;
use crate::request::{PreparedRequest, RequestId};
use crate::response::{BackendError, RawResponse};
pub(crate) mod fake;
#[cfg(feature = "http")]
pub(crate) mod http_pool;
pub type HttpTransportResult = Result<RawResponse, BackendError>;
pub trait HttpTransport: Send + Sync + 'static {
fn submit(&mut self, id: RequestId, request: PreparedRequest);
fn poll(&mut self) -> Vec<(RequestId, HttpTransportResult)>;
fn cancel(&mut self, id: RequestId) {
let _ = id;
}
fn shutdown(&mut self) {}
}
static NEXT_GENERATION: AtomicU64 = AtomicU64::new(1);
#[derive(Resource)]
pub struct HttpTransportRes {
inner: Box<dyn HttpTransport>,
generation: u64,
}
impl fmt::Debug for HttpTransportRes {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("HttpTransportRes").field("generation", &self.generation).finish_non_exhaustive()
}
}
impl HttpTransportRes {
pub fn new(transport: impl HttpTransport) -> Self {
Self { inner: Box::new(transport), generation: NEXT_GENERATION.fetch_add(1, Ordering::Relaxed) }
}
pub(crate) fn generation(&self) -> u64 {
self.generation
}
pub(crate) fn get_mut(&mut self) -> &mut dyn HttpTransport {
self.inner.as_mut()
}
}