use std::fmt;
use url::Url;
use crate::error::{Error, Result};
#[derive(Debug, Clone, PartialEq, Eq, Default)]
pub enum BaseUrl {
#[default]
Production,
Sandbox,
Custom(Url),
}
impl BaseUrl {
pub const PRODUCTION: &'static str = "https://api.assinafy.com.br/v1";
pub const SANDBOX: &'static str = "https://sandbox.assinafy.com.br/v1";
pub fn custom<S: AsRef<str>>(url: S) -> Result<Self> {
let mut s = url.as_ref().to_owned();
if !s.ends_with('/') {
s.push('/');
}
let parsed = Url::parse(&s)
.map_err(|e| Error::Config(format!("invalid base url `{}`: {e}", url.as_ref())))?;
Ok(BaseUrl::Custom(parsed))
}
pub fn as_url(&self) -> Url {
let raw = match self {
BaseUrl::Production => Self::PRODUCTION,
BaseUrl::Sandbox => Self::SANDBOX,
BaseUrl::Custom(u) => return u.clone(),
};
let mut s = raw.to_owned();
s.push('/');
Url::parse(&s).expect("static base url parses")
}
}
impl fmt::Display for BaseUrl {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
BaseUrl::Production => f.write_str(Self::PRODUCTION),
BaseUrl::Sandbox => f.write_str(Self::SANDBOX),
BaseUrl::Custom(u) => write!(f, "{}", u.as_str().trim_end_matches('/')),
}
}
}