port-plumber 0.2.1

Utility bind ports with initialization commands
Documentation
use std::fs;
use std::net::IpAddr;
use std::path::Path;
use anyhow::Context;
use axum::{Json, Router, Server, ServiceExt};
use axum::extract::{State};
use axum::routing::{get, IntoMakeService};
use hyperlocal::{SocketIncoming, UnixServerExt};
use crate::plumber::Plumber;
use crate::resolver::NameResolver;

pub fn build_server(path: impl AsRef<Path>, name_resolver: NameResolver) -> anyhow::Result<Server<SocketIncoming, IntoMakeService<Router>>> {
    if path.as_ref().exists() {
        fs::remove_file(path.as_ref())
            .context("Could not remove old socket!")?;
    }

    let app = Router::new()
        .route("/list", get(list_endpoints))
        .route("/resolve/:name", get(resolve_endpoint))
        .with_state(name_resolver);

    let srv = axum::Server::bind_unix(path)?
        .serve(app.into_make_service());

    Ok(srv)
}

#[derive(serde::Serialize, serde::Deserialize, Debug)]
pub struct Endpoint {
    pub ip: IpAddr,
}

async fn list_endpoints() -> Json<Vec<Endpoint>> {
    Json(vec![])
}

async fn resolve_endpoint(
    axum::extract::Path(name): axum::extract::Path<String>,
    State(state): State<NameResolver>
) -> Json<Option<Endpoint>> {
    let res = state.resolve(&name)
        .map(|ip| Endpoint { ip });

    Json(res)
}