use std::env::var_os;
use std::ffi::OsString;
use url::Url;
use crate::Error;
const ENV_API_URL: &str = "POLYGON_API_URL";
const ENV_STREAM_URL: &str = "POLYGON_STREAM_URL";
const ENV_API_KEY: &str = "POLYGON_API_KEY";
const DEFAULT_API_URL: &str = "https://api.polygon.io";
const DEFAULT_STREAM_URL: &str = "wss://socket.polygon.io";
#[derive(Clone, Debug, PartialEq)]
pub struct ApiInfo {
pub(crate) api_url: Url,
pub(crate) stream_url: Url,
pub(crate) api_key: String,
}
impl ApiInfo {
pub fn new<S>(api_key: S) -> Self
where
S: Into<String>,
{
Self {
api_url: Url::parse(DEFAULT_API_URL).unwrap(),
stream_url: Url::parse(DEFAULT_STREAM_URL).unwrap(),
api_key: api_key.into(),
}
}
pub fn from_env() -> Result<Self, Error> {
let api_url = var_os(ENV_API_URL)
.unwrap_or_else(|| OsString::from(DEFAULT_API_URL))
.into_string()
.map_err(|_| {
Error::Str(
format!(
"{} environment variable is not a valid string",
ENV_API_URL
)
.into(),
)
})?;
let api_url = Url::parse(&api_url)?;
let stream_url = var_os(ENV_STREAM_URL)
.unwrap_or_else(|| OsString::from(DEFAULT_STREAM_URL))
.into_string()
.map_err(|_| {
Error::Str(
format!(
"{} environment variable is not a valid string",
ENV_STREAM_URL
)
.into(),
)
})?;
let stream_url = Url::parse(&stream_url)?;
let api_key = var_os(ENV_API_KEY)
.ok_or_else(|| Error::Str(format!("{} environment variable not found", ENV_API_KEY).into()))?
.into_string()
.map_err(|_| {
Error::Str(format!("{} environment variable is not a valid string", ENV_API_KEY).into())
})?;
Ok(Self {
api_url,
stream_url,
api_key,
})
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn create_api_info() {
let _ = ApiInfo::new("XXXXXXXXXXXXXXXXXXXX");
}
}