pub mod api;
pub mod clients;
pub mod errors;
pub mod models;
use crate::errors::{Error, Kind, Result};
use std::env;
use std::env::VarError;
pub const X_AUTH_TOKEN_HEADER: &str = "X-Auth-Token";
pub const YUPDATES_API_TOKEN: &str = "YUPDATES_API_TOKEN";
pub const YUPDATES_API_URL: &str = "YUPDATES_API_URL";
pub const YUPDATES_DEFAULT_API_URL: &str = "https://feeds.yupdates.com/api/v0/";
pub fn env_or_default_url() -> Result<String> {
match env::var(YUPDATES_API_URL) {
Ok(s) => {
if s.ends_with('/') {
Ok(s)
} else {
Ok(format!("{}/", s))
}
}
Err(e) => match e {
VarError::NotPresent => Ok(YUPDATES_DEFAULT_API_URL.to_string()),
VarError::NotUnicode(_) => Err(Error {
kind: Kind::Config(format!("{} is not valid unicode", YUPDATES_API_URL)),
}),
},
}
}
pub fn api_token() -> Result<String> {
match env::var(YUPDATES_API_TOKEN) {
Ok(s) => Ok(s),
Err(e) => {
let err = match e {
VarError::NotPresent => {
format!("API token is missing, set {}", YUPDATES_API_TOKEN)
}
VarError::NotUnicode(_) => {
format!("{} is not valid unicode", YUPDATES_API_TOKEN)
}
};
Err(Error {
kind: Kind::Config(err),
})
}
}
}
pub fn normalize_item_time<S>(item_time: S) -> Result<String>
where
S: AsRef<str>,
{
let it = item_time.as_ref();
let parts = it.split('.').collect::<Vec<&str>>();
let (base_str, slot_str) = match parts.len() {
1 => (it, "0"),
2 => (parts[0], parts[1]),
_ => {
return Err(Error {
kind: Kind::Deserialization(format!("invalid item time: '{}'", it)),
});
}
};
let base_ms = parse_bounded_int(base_str, "base ms", 9_999_999_999_999)?;
let slot = parse_bounded_int(slot_str, "suffix", 99_999)?;
Ok(format!("{:0>13}.{:0>5}", base_ms, slot))
}
pub fn normalize_item_time_ms(item_time_ms: u64) -> Result<String> {
normalize_item_time(item_time_ms.to_string())
}
fn parse_bounded_int(int_str: &str, name: &str, upper_bound: u64) -> Result<u64> {
let parsed = int_str.parse::<u64>().map_err(|_| Error {
kind: Kind::IllegalParameter(format!("invalid u64: '{}'", int_str)),
})?;
if parsed > upper_bound {
return Err(Error {
kind: Kind::IllegalParameter(format!(
"item time {} may not be larger than {}: '{}'",
name, upper_bound, parsed
)),
});
}
Ok(parsed)
}