use crate::error::{Error, Result};
use crate::field_service::FieldServiceClient;
use crate::professional_services::ProfessionalServicesClient;
use crate::shift::ShiftClient;
use crate::transport::Transport;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum Environment {
#[default]
Production,
Test,
}
impl Environment {
pub fn base_url(self) -> &'static str {
match self {
Environment::Production => "https://plansolve.app",
Environment::Test => "https://test.plansolve.app",
}
}
}
pub struct Client {
pub field_service: FieldServiceClient,
pub professional_services: ProfessionalServicesClient,
pub shift: ShiftClient,
}
impl Client {
pub fn new(api_key: impl Into<String>) -> Self {
Self::with_environment(api_key, Environment::Production)
}
pub fn with_environment(api_key: impl Into<String>, environment: Environment) -> Self {
let transport = Transport::new(environment.base_url().to_string(), api_key.into());
Self {
field_service: FieldServiceClient::new(transport.clone()),
professional_services: ProfessionalServicesClient::new(transport.clone()),
shift: ShiftClient::new(transport),
}
}
pub fn from_env() -> Result<Self> {
let api_key = std::env::var("PLANSOLVE_API_KEY").unwrap_or_default();
if api_key.is_empty() {
return Err(Error::MissingApiKey);
}
Ok(Self::new(api_key))
}
}
#[cfg(test)]
mod tests {
use super::Environment;
#[test]
fn environment_urls_are_fixed() {
assert_eq!(Environment::Production.base_url(), "https://plansolve.app");
assert_eq!(Environment::Test.base_url(), "https://test.plansolve.app");
assert_eq!(Environment::default(), Environment::Production);
}
}