#[macro_use]
mod macros;
use crate::backend::Backend;
use ::url::Url;
use http::header::{HeaderName, HeaderValue};
use http::{Method, StatusCode};
use std::convert::TryFrom;
pub use self::backend::ToBackend;
pub(crate) use self::borrowable::Borrowable;
pub use self::header_name::ToHeaderName;
pub use self::header_value::ToHeaderValue;
pub use self::method::ToMethod;
pub use self::status_code::ToStatusCode;
pub use self::url::ToUrl;
mod borrowable {
pub trait Borrowable<T> {
fn as_ref(&self) -> &T;
}
}
mod header_name {
use super::*;
#[cfg_attr(
feature = "unstable-doc",
doc(include = "../docs/snippets/conversion-may-panic.md")
)]
pub trait ToHeaderName: Sealed {}
convert_stringy!(
@with_byte_impls,
HeaderName,
ToHeaderName,
Sealed,
"invalid HTTP header name",
std::fmt::Debug,
std::fmt::Display
);
impl ToHeaderName for HeaderValue {}
impl ToHeaderName for &HeaderValue {}
impl Sealed for HeaderValue {
type Borrowable = HeaderName;
fn into_borrowable(self) -> Self::Borrowable {
Sealed::into_borrowable(self.as_bytes())
}
fn into_owned(self) -> HeaderName {
Sealed::into_owned(self.as_bytes())
}
}
impl Sealed for &HeaderValue {
type Borrowable = HeaderName;
fn into_borrowable(self) -> Self::Borrowable {
Sealed::into_borrowable(self.as_bytes())
}
fn into_owned(self) -> HeaderName {
Sealed::into_owned(self.as_bytes())
}
}
}
mod header_value {
use super::*;
#[cfg_attr(
feature = "unstable-doc",
doc(include = "../docs/snippets/conversion-may-panic.md")
)]
pub trait ToHeaderValue: Sealed {}
convert_stringy!(
@with_byte_impls,
HeaderValue,
ToHeaderValue,
Sealed,
"invalid HTTP header value",
std::fmt::Debug
);
impl ToHeaderValue for HeaderName {}
impl ToHeaderValue for &HeaderName {}
impl ToHeaderValue for Url {}
impl ToHeaderValue for &Url {}
impl Sealed for HeaderName {
type Borrowable = HeaderValue;
fn into_borrowable(self) -> Self::Borrowable {
HeaderValue::from(self)
}
fn into_owned(self) -> HeaderValue {
HeaderValue::from(self)
}
}
impl Sealed for &HeaderName {
type Borrowable = HeaderValue;
fn into_borrowable(self) -> Self::Borrowable {
HeaderValue::from(self.clone())
}
fn into_owned(self) -> HeaderValue {
HeaderValue::from(self.clone())
}
}
impl Sealed for Url {
type Borrowable = HeaderValue;
fn into_borrowable(self) -> Self::Borrowable {
self.into_string().into_borrowable()
}
fn into_owned(self) -> HeaderValue {
self.into_string().into_owned()
}
}
impl Sealed for &Url {
type Borrowable = HeaderValue;
fn into_borrowable(self) -> Self::Borrowable {
self.as_str().into_borrowable()
}
fn into_owned(self) -> HeaderValue {
self.as_str().into_owned()
}
}
}
mod method {
use super::*;
#[cfg_attr(
feature = "unstable-doc",
doc(include = "../docs/snippets/conversion-may-panic.md")
)]
pub trait ToMethod: Sealed {}
convert_stringy!(
@with_byte_impls,
Method,
ToMethod,
Sealed,
"invalid HTTP method",
std::fmt::Debug,
std::fmt::Display
);
}
mod url {
use super::*;
#[cfg_attr(
feature = "unstable-doc",
doc(include = "../docs/snippets/conversion-may-panic.md")
)]
pub trait ToUrl: Sealed {}
convert_stringy!(
Url,
ToUrl,
Sealed,
"invalid URL",
std::fmt::Debug,
std::fmt::Display
);
}
mod status_code {
use super::*;
#[cfg_attr(
feature = "unstable-doc",
doc(include = "../docs/snippets/conversion-may-panic.md")
)]
pub trait ToStatusCode: Sealed {}
impl ToStatusCode for StatusCode {}
impl ToStatusCode for u16 {}
pub trait Sealed {
fn to_status_code(self) -> StatusCode;
}
impl Sealed for StatusCode {
fn to_status_code(self) -> StatusCode {
self
}
}
impl Sealed for u16 {
fn to_status_code(self) -> StatusCode {
StatusCode::from_u16(self)
.unwrap_or_else(|_| panic!("invalid HTTP status code: {}", self))
}
}
}
mod backend {
use super::*;
#[cfg_attr(
feature = "unstable-doc",
doc(include = "../docs/snippets/conversion-may-panic.md")
)]
pub trait ToBackend: Sealed {}
convert_stringy!(
Backend,
ToBackend,
Sealed,
"invalid backend",
std::fmt::Debug
);
}