Documentation
use anyhow::{Result, bail};
use std::collections::HashMap;

use super::{NetworkProvider, ProviderSpec, reject_unknown_query};

pub struct KubectlProvider;

impl NetworkProvider for KubectlProvider {
    fn scheme(&self) -> &'static str {
        "kubectl"
    }

    fn parse(
        &self,
        authority: &str,
        segments: &[&str],
        query: &HashMap<String, String>,
    ) -> Result<ProviderSpec> {
        let [context_selector, namespace, kind, name, remote_port] = segments else {
            bail!(
                "kubectl URI must be /<context-selector>/<namespace>/<kind>/<name>/<remote-port>"
            );
        };
        reject_unknown_query(query, &["local", "pod-running-timeout"])?;
        Ok(ProviderSpec::Kubectl {
            cluster_endpoint: authority.to_string(),
            context_selector: (*context_selector).to_string(),
            namespace: namespace.to_string(),
            kind: kind.to_string(),
            name: name.to_string(),
            remote_port: remote_port.to_string(),
            pod_running_timeout: query.get("pod-running-timeout").cloned(),
        })
    }
}