pub use bytes::Bytes;
pub use http::{self, HeaderMap, Method};
use serde::{
Serialize,
ser::{SerializeSeq, SerializeTuple},
};
use std::sync::{
Arc,
atomic::{AtomicBool, Ordering},
};
use std::{ops::Deref, path::PathBuf};
pub use url::Url;
pub trait NetProvider: Send + Sync + 'static {
fn fetch(&self, doc_id: usize, request: Request, handler: Box<dyn NetHandler>);
}
pub trait NetHandler: Send + Sync + 'static {
fn bytes(self: Box<Self>, resolved_url: String, bytes: Bytes);
}
pub trait NetWaker: Send + Sync + 'static {
fn wake(&self, client_id: usize);
}
impl<F: Fn(usize) + Send + Sync + 'static> NetWaker for F {
fn wake(&self, doc_id: usize) {
self(doc_id)
}
}
#[non_exhaustive]
#[derive(Debug, Clone)]
pub struct Request {
pub url: Url,
pub method: Method,
pub content_type: String,
pub headers: HeaderMap,
pub body: Body,
pub signal: Option<AbortSignal>,
}
impl Request {
pub fn get(url: Url) -> Self {
Self {
url,
method: Method::GET,
content_type: String::new(),
headers: HeaderMap::new(),
body: Body::Empty,
signal: None,
}
}
pub fn signal(mut self, signal: AbortSignal) -> Self {
self.signal = Some(signal);
self
}
}
#[derive(Debug, Clone)]
pub enum Body {
Bytes(Bytes),
Form(FormData),
Empty,
}
#[derive(Debug, Clone, PartialEq, Default)]
pub struct FormData(pub Vec<Entry>);
impl FormData {
pub fn new() -> Self {
FormData(Vec::new())
}
}
impl Serialize for FormData {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
let mut seq_serializer = serializer.serialize_seq(Some(self.len()))?;
for entry in &self.0 {
seq_serializer.serialize_element(entry)?;
}
seq_serializer.end()
}
}
impl Deref for FormData {
type Target = Vec<Entry>;
fn deref(&self) -> &Self::Target {
&self.0
}
}
#[derive(Debug, Clone, PartialEq)]
pub struct Entry {
pub name: String,
pub value: EntryValue,
}
impl Serialize for Entry {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
let mut serializer = serializer.serialize_tuple(2)?;
serializer.serialize_element(&self.name)?;
match &self.value {
EntryValue::String(s) => serializer.serialize_element(s)?,
EntryValue::File(p) => serializer.serialize_element(p.to_str().unwrap_or_default())?,
EntryValue::EmptyFile => serializer.serialize_element("")?,
}
serializer.end()
}
}
#[derive(Debug, Clone, PartialEq)]
pub enum EntryValue {
String(String),
File(PathBuf),
EmptyFile,
}
impl AsRef<str> for EntryValue {
fn as_ref(&self) -> &str {
match self {
EntryValue::String(s) => s,
EntryValue::File(p) => p.to_str().unwrap_or_default(),
EntryValue::EmptyFile => "",
}
}
}
impl From<&str> for EntryValue {
fn from(value: &str) -> Self {
EntryValue::String(value.to_string())
}
}
impl From<PathBuf> for EntryValue {
fn from(value: PathBuf) -> Self {
EntryValue::File(value)
}
}
#[derive(Default)]
pub struct DummyNetProvider;
impl NetProvider for DummyNetProvider {
fn fetch(&self, _doc_id: usize, _request: Request, _handler: Box<dyn NetHandler>) {}
}
#[derive(Debug, Default)]
pub struct AbortController {
pub signal: AbortSignal,
}
impl AbortController {
pub fn abort(self) {
self.signal.0.store(true, Ordering::SeqCst);
}
}
#[derive(Debug, Default, Clone)]
pub struct AbortSignal(Arc<AtomicBool>);
impl AbortSignal {
pub fn aborted(&self) -> bool {
self.0.load(Ordering::SeqCst)
}
}