dnsync 0.2.1

DNS Sync and Control with MCP
Documentation
pub mod client;
pub mod config;
pub mod mapping;
pub mod responses;
pub mod service;

use std::env;

use crate::control_plane::config::{self as app_config, DnsServerConfig};
use crate::core::error::{Error, Result};
use crate::core::secret::ApiToken;
use crate::vendors::runtime::ClientOverrides;

pub fn client_from_cli_without_config(
    overrides: ClientOverrides<'_>,
) -> Result<client::TechnitiumClient> {
    let base_url = overrides
        .base_url
        .map(ToOwned::to_owned)
        .or_else(|| env::var("DNSYNC_TECHNITIUM_BASE_URL").ok())
        .or_else(|| env::var("TECHNITIUM_BASE_URL").ok())
        .unwrap_or_else(|| app_config::TECHNITIUM_DEFAULT_BASE_URL.to_string());
    let token = overrides
        .token
        .map(ToOwned::to_owned)
        .or_else(|| env::var("DNSYNC_TECHNITIUM_API_TOKEN").ok())
        .or_else(|| env::var("TECHNITIUM_API_TOKEN").ok())
        .ok_or_else(|| {
            Error::parse(
                "API token is required from --token, DNSYNC_TECHNITIUM_API_TOKEN, TECHNITIUM_API_TOKEN, or config",
            )
        })
        .map(ApiToken::new)?;
    client::TechnitiumClient::new(base_url, token)
}

pub fn client_from_server(
    server: &DnsServerConfig,
    overrides: ClientOverrides<'_>,
) -> Result<client::TechnitiumClient> {
    let base_url = overrides
        .base_url
        .map(ToOwned::to_owned)
        .or_else(|| env::var("DNSYNC_TECHNITIUM_BASE_URL").ok())
        .or_else(|| env::var("TECHNITIUM_BASE_URL").ok())
        .or_else(|| server.base_url_env.as_ref().and_then(|k| env::var(k).ok()))
        .or_else(|| server.base_url.clone())
        .unwrap_or_else(|| app_config::TECHNITIUM_DEFAULT_BASE_URL.to_string());
    let token = overrides
        .token
        .map(ToOwned::to_owned)
        .or_else(|| env::var("DNSYNC_TECHNITIUM_API_TOKEN").ok())
        .or_else(|| env::var("TECHNITIUM_API_TOKEN").ok())
        .or_else(|| server.token_env.as_ref().and_then(|k| env::var(k).ok()))
        .or_else(|| server.token.clone())
        .ok_or_else(|| {
            Error::parse(
                "API token is required from --token, DNSYNC_TECHNITIUM_API_TOKEN, TECHNITIUM_API_TOKEN, token_env, or config token",
            )
        })
        .map(ApiToken::new)?;
    client::TechnitiumClient::new(base_url, token)
}