use std::sync::Arc;
use reqwest::cookie::Jar;
use secrecy::SecretString;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum AuthStrategy {
Session,
ApiKey,
CloudApiKey,
}
#[derive(Debug, Clone)]
pub enum Credentials {
Session { cookie_jar: Arc<Jar> },
ApiKey { key: SecretString },
Cloud { key: SecretString, host_id: String },
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ControllerPlatform {
UnifiOs,
ClassicController,
Cloud,
}
impl ControllerPlatform {
pub fn session_prefix(&self) -> Option<&'static str> {
match self {
Self::UnifiOs => Some("/proxy/network"),
Self::ClassicController => Some(""),
Self::Cloud => None,
}
}
pub fn integration_prefix(&self) -> &'static str {
match self {
Self::UnifiOs | Self::Cloud => "/proxy/network/integration",
Self::ClassicController => "/integration",
}
}
pub fn login_path(&self) -> Option<&'static str> {
match self {
Self::UnifiOs => Some("/api/auth/login"),
Self::ClassicController => Some("/api/login"),
Self::Cloud => None,
}
}
pub fn logout_path(&self) -> Option<&'static str> {
match self {
Self::UnifiOs => Some("/api/auth/logout"),
Self::ClassicController => Some("/api/logout"),
Self::Cloud => None,
}
}
pub fn websocket_path(&self) -> Option<&'static str> {
match self {
Self::UnifiOs => Some("/proxy/network/wss/s/{site}/events"),
Self::ClassicController => Some("/wss/s/{site}/events"),
Self::Cloud => None,
}
}
}
#[cfg(test)]
mod tests {
use super::ControllerPlatform;
#[test]
fn cloud_uses_unifi_os_integration_prefix() {
assert_eq!(
ControllerPlatform::Cloud.integration_prefix(),
"/proxy/network/integration"
);
}
}