mirror of https://github.com/rwf2/Rocket.git
Upgrade 'smallvec' to simplify 'Accept' impl.
This commit is contained in:
parent
3e33cfe37c
commit
a285625f80
|
@ -25,7 +25,7 @@ serde = ["uncased/with-serde-alloc", "serde_"]
|
||||||
uuid = ["uuid_"]
|
uuid = ["uuid_"]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
smallvec = "1.0"
|
smallvec = { version = "1.11", features = ["const_generics", "const_new"] }
|
||||||
percent-encoding = "2"
|
percent-encoding = "2"
|
||||||
http = "0.2"
|
http = "0.2"
|
||||||
time = { version = "0.3", features = ["formatting", "macros"] }
|
time = { version = "0.3", features = ["formatting", "macros"] }
|
||||||
|
|
|
@ -12,12 +12,6 @@ pub trait IntoCollection<T>: Sized {
|
||||||
|
|
||||||
#[doc(hidden)]
|
#[doc(hidden)]
|
||||||
fn mapped<U, F: FnMut(T) -> U, A: Array<Item=U>>(self, f: F) -> SmallVec<A>;
|
fn mapped<U, F: FnMut(T) -> U, A: Array<Item=U>>(self, f: F) -> SmallVec<A>;
|
||||||
|
|
||||||
#[doc(hidden)]
|
|
||||||
fn mapped_vec<U, F: FnMut(T) -> U>(self, f: F) -> Vec<U> {
|
|
||||||
let small = self.mapped::<U, F, [U; 0]>(f);
|
|
||||||
small.into_vec()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T> IntoCollection<T> for T {
|
impl<T> IntoCollection<T> for T {
|
||||||
|
|
|
@ -3,7 +3,6 @@ use std::str::FromStr;
|
||||||
use std::fmt;
|
use std::fmt;
|
||||||
|
|
||||||
use smallvec::SmallVec;
|
use smallvec::SmallVec;
|
||||||
use either::Either;
|
|
||||||
|
|
||||||
use crate::{Header, MediaType};
|
use crate::{Header, MediaType};
|
||||||
use crate::ext::IntoCollection;
|
use crate::ext::IntoCollection;
|
||||||
|
@ -53,30 +52,21 @@ use crate::parse::parse_accept;
|
||||||
/// let response = Response::build().header(Accept::JSON).finalize();
|
/// let response = Response::build().header(Accept::JSON).finalize();
|
||||||
/// ```
|
/// ```
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
pub struct Accept(pub(crate) AcceptParams);
|
pub struct Accept(pub(crate) SmallVec<[QMediaType; 1]>);
|
||||||
|
|
||||||
/// A `MediaType` with an associated quality value.
|
/// A `MediaType` with an associated quality value.
|
||||||
#[derive(Debug, Clone, PartialEq)]
|
#[derive(Debug, Clone, PartialEq)]
|
||||||
pub struct QMediaType(pub MediaType, pub Option<f32>);
|
pub struct QMediaType(pub MediaType, pub Option<f32>);
|
||||||
|
|
||||||
// NOTE: `Static` is needed for `const` items. Need `const SmallVec::new`.
|
|
||||||
#[derive(Debug, Clone)]
|
|
||||||
pub enum AcceptParams {
|
|
||||||
Static(QMediaType),
|
|
||||||
Dynamic(SmallVec<[QMediaType; 1]>)
|
|
||||||
}
|
|
||||||
|
|
||||||
macro_rules! accept_constructor {
|
macro_rules! accept_constructor {
|
||||||
($($name:ident ($check:ident): $str:expr, $t:expr,
|
($($name:ident ($check:ident): $str:expr, $t:expr,
|
||||||
$s:expr $(; $k:expr => $v:expr)*,)+) => {
|
$s:expr $(; $k:expr => $v:expr)*,)+) => {
|
||||||
$(
|
$(
|
||||||
#[doc="An `Accept` header with the single media type for <b>"]
|
#[doc="An `Accept` header with the single media type for"]
|
||||||
#[doc=$str] #[doc="</b>: <i>"]
|
#[doc=concat!("**", $str, "**: ", "_", $t, "/", $s, "_")]
|
||||||
#[doc=$t] #[doc="/"] #[doc=$s]
|
|
||||||
#[doc="</i>"]
|
|
||||||
#[allow(non_upper_case_globals)]
|
#[allow(non_upper_case_globals)]
|
||||||
pub const $name: Accept = Accept(
|
pub const $name: Accept = Accept(
|
||||||
AcceptParams::Static(QMediaType(MediaType::$name, None))
|
SmallVec::from_const([QMediaType(MediaType::$name, None)])
|
||||||
);
|
);
|
||||||
)+
|
)+
|
||||||
};
|
};
|
||||||
|
@ -111,7 +101,7 @@ impl Accept {
|
||||||
/// ```
|
/// ```
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
pub fn new<T: IntoCollection<QMediaType>>(items: T) -> Accept {
|
pub fn new<T: IntoCollection<QMediaType>>(items: T) -> Accept {
|
||||||
Accept(AcceptParams::Dynamic(items.into_collection()))
|
Accept(items.into_collection())
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Implement this.
|
// TODO: Implement this.
|
||||||
|
@ -211,10 +201,7 @@ impl Accept {
|
||||||
/// ```
|
/// ```
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
pub fn iter(&self) -> impl Iterator<Item=&'_ QMediaType> + '_ {
|
pub fn iter(&self) -> impl Iterator<Item=&'_ QMediaType> + '_ {
|
||||||
match self.0 {
|
self.0.iter()
|
||||||
AcceptParams::Static(ref val) => Either::Left(Some(val).into_iter()),
|
|
||||||
AcceptParams::Dynamic(ref vec) => Either::Right(vec.iter())
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns an iterator over all of the (bare) media types in `self`. Media
|
/// Returns an iterator over all of the (bare) media types in `self`. Media
|
||||||
|
@ -249,7 +236,7 @@ impl Accept {
|
||||||
impl<T: IntoCollection<MediaType>> From<T> for Accept {
|
impl<T: IntoCollection<MediaType>> From<T> for Accept {
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
fn from(items: T) -> Accept {
|
fn from(items: T) -> Accept {
|
||||||
Accept(AcceptParams::Dynamic(items.mapped(|item| item.into())))
|
Accept(items.mapped(|item| item.into()))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -361,21 +348,6 @@ impl Deref for QMediaType {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for AcceptParams {
|
|
||||||
fn default() -> Self {
|
|
||||||
AcceptParams::Dynamic(SmallVec::new())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Extend<QMediaType> for AcceptParams {
|
|
||||||
fn extend<T: IntoIterator<Item = QMediaType>>(&mut self, iter: T) {
|
|
||||||
match self {
|
|
||||||
AcceptParams::Static(..) => panic!("can't add to static collection!"),
|
|
||||||
AcceptParams::Dynamic(ref mut v) => v.extend(iter)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod test {
|
mod test {
|
||||||
use crate::{Accept, MediaType};
|
use crate::{Accept, MediaType};
|
||||||
|
|
|
@ -1,5 +1,3 @@
|
||||||
#![recursion_limit="512"]
|
|
||||||
|
|
||||||
#![warn(rust_2018_idioms)]
|
#![warn(rust_2018_idioms)]
|
||||||
#![warn(missing_docs)]
|
#![warn(missing_docs)]
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue