lenso-cli 0.2.18

Lenso command-line interface for scaffolding and operating Lenso backend projects.
use axum::{Json, Router, routing::get};
use serde_json::{Value, json};

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    if std::env::args().any(|arg| arg == "--check") {
        println!("{}", serde_json::to_string_pretty(&service_manifest())?);
        return Ok(());
    }
    if std::env::args().any(|arg| arg == "--check-release") {
        println!("{}", serde_json::to_string_pretty(&module_release())?);
        return Ok(());
    }

    let port = std::env::var("PORT")
        .ok()
        .and_then(|value| value.parse::<u16>().ok())
        .unwrap_or({{service_port}});
    let app = Router::new()
        .route("/lenso/service/v1/manifest", get(manifest))
        .merge(lenso_service::health_router());
    let listener = tokio::net::TcpListener::bind(("127.0.0.1", port)).await?;

    println!("Lenso service ready: http://127.0.0.1:{port}/lenso/service/v1/manifest");
    axum::serve(listener, app).await?;
    Ok(())
}

async fn manifest() -> Json<Value> {
    Json(service_manifest())
}

fn service_manifest() -> Value {
    json!({
        "name": "{{service_name}}",
        "version": "0.1.0",
        "provider": {
            "name": "{{service_name}}",
            "summary": "{{service_label}} provider",
        },
        "compatibility": {
            "providerProtocolVersion": "lenso.provider.v1",
            "requiredHostFeatures": ["service.status"],
        },
        "install": {
            "services": [
                {
                    "name": "{{service_name}}",
                    "command": "cargo run",
                    "cwd": {{service_cwd}},
                    "readyUrl": "{{service_status_url}}",
                    "autoStart": true,
                    "readyTimeoutMs": 10000,
                },
            ],
        },
        "modules": [
            {
                "name": "{{module_name}}",
                "version": "0.1.0",
                "capabilities": ["{{module_name}}.read"],
            },
        ],
    })
}

fn module_release() -> Value {
    json!({
        "protocol": "lenso.module-release.v1",
        "name": "{{module_name}}",
        "version": "0.1.0",
        "source": "service",
        "provider": {
            "name": "{{service_name}}",
            "serviceManifest": "{{local_service_base_url}}/manifest",
        },
        "capabilities": ["{{module_name}}.read"],
    })
}