use std::{fmt::Display, io, str::FromStr};
use wenmeng::Rate;
use crate::{ConfigSize, ConfigDuration};
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ConfigRate(pub Rate);
impl ConfigRate {
pub fn new(dur: Rate) -> Self {
Self(dur)
}
}
impl From<Rate> for ConfigRate {
fn from(value: Rate) -> Self {
ConfigRate(value)
}
}
impl From<ConfigRate> for Rate {
fn from(value: ConfigRate) -> Rate {
value.0
}
}
impl FromStr for ConfigRate {
type Err = io::Error;
fn from_str(s: &str) -> Result<Self, Self::Err> {
if s.len() == 0 {
return Err(io::Error::new(io::ErrorKind::InvalidInput, ""));
}
let rate_key = s.split("/").map(|k| k.trim()).collect::<Vec<&str>>();
if rate_key.len() == 1 {
return Err(io::Error::new(io::ErrorKind::Other, "未知的LimitReq"));
}
let size = ConfigSize::from_str(rate_key[0])?;
let duration = ConfigDuration::from_str(rate_key[1])?;
Ok(ConfigRate::new(Rate::new(size.0, duration.0)))
}
}
impl Display for ConfigRate {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
self.0.fmt(f)
}
}