#![cfg_attr(docsrs, feature(doc_cfg))]
#![forbid(unsafe_code)]
#![deny(
clippy::dbg_macro,
missing_copy_implementations,
rustdoc::missing_crate_level_docs,
missing_debug_implementations,
missing_docs,
nonstandard_style,
unused_qualifications
)]
#[cfg(test)]
#[doc = include_str!("../README.md")]
mod readme {}
mod assertions;
mod test_transport;
use std::{future::Future, process::Termination, sync::Arc};
pub use test_transport::TestTransport;
mod test_conn;
pub use test_conn::TestConn;
pub mod methods;
pub mod prelude {
pub use crate::{
assert_body, assert_body_contains, assert_headers, assert_not_handled, assert_ok,
assert_response, assert_status, block_on, connector, init, methods::*,
};
pub use trillium::{Conn, Method, Status};
}
use trillium::{Handler, Info};
pub use trillium::{Method, Status};
use trillium_http::HttpContext;
pub use url::Url;
pub fn block_on<Fut: Future>(fut: Fut) -> Fut::Output {
runtime().block_on(fut)
}
pub async fn init(handler: &mut impl Handler) -> Arc<HttpContext> {
let mut info = Info::from(HttpContext::default());
info.insert_shared_state(runtime());
info.insert_shared_state(runtime().into());
handler.init(&mut info).await;
Arc::new(info.into())
}
pub use futures_lite::{self, AsyncRead, AsyncReadExt, AsyncWrite, Stream};
mod server_connector;
pub use server_connector::{ServerConnector, connector};
use trillium_server_common::Config;
pub use trillium_server_common::{
ArcedConnector, Connector, Runtime, RuntimeTrait, Server, ServerHandle,
};
#[cfg(unix)]
#[doc(hidden)]
pub trait QuicSocket: std::os::unix::io::AsFd {}
#[cfg(unix)]
impl<T: std::os::unix::io::AsFd> QuicSocket for T {}
#[doc(hidden)]
#[cfg(windows)]
pub trait QuicSocket: std::os::windows::io::AsSocket {}
#[cfg(windows)]
impl<T: std::os::windows::io::AsSocket> QuicSocket for T {}
cfg_if::cfg_if! {
if #[cfg(feature = "smol")] {
pub fn config() -> Config<impl Server<Runtime: Unpin, UdpTransport: QuicSocket>, ()> {
trillium_smol::config()
}
pub fn client_config() -> impl Connector<Runtime: Unpin, Udp: QuicSocket> {
trillium_smol::ClientConfig::default()
}
pub fn runtime() -> impl RuntimeTrait {
trillium_smol::SmolRuntime::default()
}
} else if #[cfg(feature = "async-std")] {
pub fn config() -> Config<impl Server<Runtime: Unpin, UdpTransport: QuicSocket>, ()> {
trillium_async_std::config()
}
pub fn client_config() -> impl Connector<Runtime: Unpin, Udp: QuicSocket> {
trillium_async_std::ClientConfig::default()
}
pub fn runtime() -> impl RuntimeTrait {
trillium_async_std::AsyncStdRuntime::default()
}
} else if #[cfg(feature = "tokio")] {
pub fn config() -> Config<impl Server<Runtime: Unpin, UdpTransport: QuicSocket>, ()> {
trillium_tokio::config()
}
pub fn client_config() -> impl Connector<Runtime: Unpin, Udp: QuicSocket> {
trillium_tokio::ClientConfig::default()
}
pub fn runtime() -> impl RuntimeTrait {
trillium_tokio::TokioRuntime::default()
}
} else {
pub fn config() -> Config<impl Server, ()> {
Config::<RuntimelessServer, ()>::new()
}
pub fn client_config() -> impl Connector {
RuntimelessClientConfig::default()
}
pub fn runtime() -> impl RuntimeTrait {
RuntimelessRuntime::default()
}
}
}
mod with_server;
pub use with_server::{with_server, with_transport};
mod test_server;
pub use test_server::{ConnTest, TestServer};
mod runtimeless;
pub use runtimeless::{RuntimelessClientConfig, RuntimelessRuntime, RuntimelessServer};
pub type TestResult = Result<(), Box<dyn std::error::Error>>;
#[track_caller]
pub fn harness<F, Fut, Output>(test: F) -> Output
where
F: FnOnce() -> Fut,
Fut: Future<Output = Output>,
Output: Termination,
{
let _ = env_logger::builder().is_test(true).try_init();
block_on(test())
}
#[track_caller]
pub fn with_runtime<F, Fut, Output>(test: F) -> Output
where
F: FnOnce(Runtime) -> Fut,
Fut: Future<Output = Output>,
Output: Termination,
{
let runtime = runtime();
runtime.clone().block_on(test(runtime.into()))
}
pub use test_harness::test;
mod http_test;
#[doc(hidden)]
pub use http_test::HttpTest;
#[cfg(all(feature = "serde_json", feature = "sonic-rs"))]
compile_error!("cargo features \"serde_json\" and \"sonic-rs\" are mutually exclusive");
#[cfg(feature = "serde_json")]
#[cfg_attr(docsrs, doc(cfg(feature = "serde_json")))]
pub use serde_json::{Value, from_str as from_json_str, json, to_string as to_json_string};
#[cfg(feature = "sonic-rs")]
#[cfg_attr(docsrs, doc(cfg(feature = "sonic-rs")))]
pub use sonic_rs::{Value, from_str as from_json_str, json, to_string as to_json_string};