chore(stability): remove core feature gate
This commit is contained in:
@@ -6,7 +6,6 @@
|
||||
use std::cmp;
|
||||
use std::default::Default;
|
||||
use std::fmt;
|
||||
use std::num::{FromPrimitive, ToPrimitive};
|
||||
use std::str;
|
||||
|
||||
/// Represents a quality used in quality values.
|
||||
@@ -20,7 +19,7 @@ use std::str;
|
||||
/// floating point data type (`f32`) consumes four bytes, hyper uses an `u16` value to store the
|
||||
/// quality internally. For performance reasons you may set quality directly to a value between
|
||||
/// 0 and 1000 e.g. `Quality(532)` matches the quality `q=0.532`.
|
||||
#[derive(Clone, Debug, Eq, Ord, PartialEq, PartialOrd)]
|
||||
#[derive(Copy, Clone, Debug, Eq, Ord, PartialEq, PartialOrd)]
|
||||
pub struct Quality(pub u16);
|
||||
|
||||
impl fmt::Display for Quality {
|
||||
@@ -33,43 +32,6 @@ impl fmt::Display for Quality {
|
||||
}
|
||||
}
|
||||
|
||||
impl FromPrimitive for Quality {
|
||||
fn from_i64(n: i64) -> Option<Quality> {
|
||||
match n >= 0 {
|
||||
true => FromPrimitive::from_u64(n as u64),
|
||||
false => None,
|
||||
}
|
||||
}
|
||||
|
||||
fn from_u64(n: u64) -> Option<Quality> {
|
||||
match n <= 1000 {
|
||||
true => Some(Quality(n as u16)),
|
||||
false => None,
|
||||
}
|
||||
}
|
||||
|
||||
fn from_f64(n: f64) -> Option<Quality> {
|
||||
match n >= 0f64 && n <= 1f64 {
|
||||
true => Some(Quality((n * 1000f64) as u16)),
|
||||
false => None,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl ToPrimitive for Quality {
|
||||
fn to_i64(&self) -> Option<i64> {
|
||||
Some(self.0 as i64)
|
||||
}
|
||||
|
||||
fn to_u64(&self) -> Option<u64> {
|
||||
Some(self.0 as u64)
|
||||
}
|
||||
|
||||
fn to_f64(&self) -> Option<f64> {
|
||||
Some((self.0 as f64) / 1000f64)
|
||||
}
|
||||
}
|
||||
|
||||
impl Default for Quality {
|
||||
fn default() -> Quality {
|
||||
Quality(1000)
|
||||
@@ -91,7 +53,10 @@ impl<T> QualityItem<T> {
|
||||
/// The item can be of any type.
|
||||
/// The quality should be a value in the range [0, 1].
|
||||
pub fn new(item: T, quality: Quality) -> QualityItem<T> {
|
||||
QualityItem{item: item, quality: quality}
|
||||
QualityItem {
|
||||
item: item,
|
||||
quality: quality
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -136,12 +101,21 @@ impl<T: str::FromStr> str::FromStr for QualityItem<T> {
|
||||
}
|
||||
}
|
||||
match raw_item.parse::<T>() {
|
||||
Ok(item) => Ok(QualityItem::new(item, FromPrimitive::from_f32(quality).unwrap())),
|
||||
// we already checked above that the quality is within range
|
||||
Ok(item) => Ok(QualityItem::new(item, from_f32(quality))),
|
||||
Err(_) => return Err(()),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn from_f32(f: f32) -> Quality {
|
||||
// this function is only used internally. A check that `f` is within range
|
||||
// should be done before calling this method. Just in case, this
|
||||
// debug_assert should catch if we were forgetful
|
||||
debug_assert!(f >= 0f32 && f <= 1f32, "q value must be between 0.0 and 1.0");
|
||||
Quality((f * 1000f32) as u16)
|
||||
}
|
||||
|
||||
/// Convinience function to wrap a value in a `QualityItem`
|
||||
/// Sets `q` to the default 1.0
|
||||
pub fn qitem<T>(item: T) -> QualityItem<T> {
|
||||
@@ -150,13 +124,12 @@ pub fn qitem<T>(item: T) -> QualityItem<T> {
|
||||
|
||||
/// Convenience function to create a `Quality` fromt a float.
|
||||
pub fn q(f: f32) -> Quality {
|
||||
FromPrimitive::from_f32(f).expect("q value must be between 0.0 and 1.0")
|
||||
assert!(f >= 0f32 && f <= 1f32, "q value must be between 0.0 and 1.0");
|
||||
from_f32(f)
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use std::num::FromPrimitive;
|
||||
|
||||
use super::*;
|
||||
use super::super::encoding::*;
|
||||
|
||||
@@ -206,25 +179,32 @@ mod tests {
|
||||
assert_eq!(x, Err(()));
|
||||
}
|
||||
#[test]
|
||||
fn test_quality_item_from_str6() {
|
||||
let x: Result<QualityItem<Encoding>, ()> = "gzip; q=2".parse();
|
||||
assert_eq!(x, Err(()));
|
||||
}
|
||||
#[test]
|
||||
fn test_quality_item_ordering() {
|
||||
let x: QualityItem<Encoding> = "gzip; q=0.5".parse().ok().unwrap();
|
||||
let y: QualityItem<Encoding> = "gzip; q=0.273".parse().ok().unwrap();
|
||||
let comparision_result: bool = x.gt(&y);
|
||||
assert_eq!(comparision_result, true)
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_quality() {
|
||||
assert_eq!(Some(Quality(421)), FromPrimitive::from_f64(0.421f64));
|
||||
assert_eq!(Some(Quality(421)), FromPrimitive::from_f32(0.421f32));
|
||||
assert_eq!(Some(Quality(421)), FromPrimitive::from_i16(421i16));
|
||||
assert_eq!(Some(Quality(421)), FromPrimitive::from_i32(421i32));
|
||||
assert_eq!(Some(Quality(421)), FromPrimitive::from_i64(421i64));
|
||||
assert_eq!(Some(Quality(421)), FromPrimitive::from_u16(421u16));
|
||||
assert_eq!(Some(Quality(421)), FromPrimitive::from_u32(421u32));
|
||||
assert_eq!(Some(Quality(421)), FromPrimitive::from_u64(421u64));
|
||||
assert_eq!(q(0.5), Quality(500));
|
||||
}
|
||||
|
||||
assert_eq!(None::<Quality>, FromPrimitive::from_i16(-5i16));
|
||||
assert_eq!(None::<Quality>, FromPrimitive::from_i32(5000i32));
|
||||
assert_eq!(None::<Quality>, FromPrimitive::from_f32(2.5f32));
|
||||
#[test]
|
||||
#[should_panic]
|
||||
fn test_quality_invalid() {
|
||||
q(-1.0);
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[should_panic]
|
||||
fn test_quality_invalid2() {
|
||||
q(2.0);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user