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

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

pub struct TshProvider;

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

    fn parse(
        &self,
        authority: &str,
        segments: &[&str],
        query: &HashMap<String, String>,
    ) -> Result<ProviderSpec> {
        if segments.len() != 5 {
            bail!("tsh URI must be /<kube-cluster>/<namespace>/<kind>/<name>/<remote-port>");
        }
        reject_unknown_query(query, &["local"])?;
        Ok(ProviderSpec::Tsh {
            teleport_proxy: authority.to_string(),
            kube_cluster: segments[0].to_string(),
            namespace: segments[1].to_string(),
            kind: segments[2].to_string(),
            name: segments[3].to_string(),
            remote_port: segments[4].parse::<u16>()?,
        })
    }
}