#!/usr/bin/env bash # resolve_cpp_app_dir — Resuelve nombre y directorio absoluto de una app C++ del registry. # Sin arg: deduce desde CWD si esta dentro de cpp/apps// o projects/*/apps//. # Con arg: usa el nombre directamente y busca en ambas ubicaciones. # Salida: "\t" en stdout (TAB separado), exit 0. # Error: lista apps disponibles en stderr + exit 1. resolve_cpp_app_dir() { local app_arg="${1:-}" local root="${FN_REGISTRY_ROOT:-/home/lucas/fn_registry}" # --- Deducir desde CWD si no hay argumento --- if [ -z "$app_arg" ]; then local cwd cwd="$(pwd)" case "$cwd" in "$root"/cpp/apps/*/|"$root"/cpp/apps/*) # Extraer primer segmento tras cpp/apps/ local rel="${cwd#"$root/cpp/apps/"}" app_arg="${rel%%/*}" ;; "$root"/projects/*/apps/*/|"$root"/projects/*/apps/*) # Extraer primer segmento tras la ultima /apps/ local rel="${cwd#"$root/projects/"}" rel="${rel#*/apps/}" app_arg="${rel%%/*}" ;; esac fi # --- Aun vacio: listar y abortar --- if [ -z "$app_arg" ]; then echo "ERROR: no se pudo deducir la app desde el directorio actual." >&2 echo "" >&2 echo "Apps disponibles:" >&2 { ls "$root/cpp/apps/" 2>/dev/null | sed 's/^/ cpp\/apps\//' for proj in "$root"/projects/*/apps/; do ls "$proj" 2>/dev/null | sed "s|^| $(echo "$proj" | sed "s|$root/||")|" done } >&2 echo "" >&2 echo "Uso: resolve_cpp_app_dir " >&2 return 1 fi # --- Buscar directorio real --- local app_dir="" # Primero: cpp/apps/ if [ -d "$root/cpp/apps/$app_arg" ]; then app_dir="$root/cpp/apps/$app_arg" fi # Segundo: projects/*/apps/ (primer match) if [ -z "$app_dir" ]; then for cand in "$root"/projects/*/apps/"$app_arg"; do if [ -d "$cand" ]; then app_dir="$cand" break fi done fi if [ -z "$app_dir" ]; then echo "ERROR: no se encuentra app '$app_arg' en cpp/apps/ ni en projects/*/apps/" >&2 echo "" >&2 echo "Apps disponibles:" >&2 { ls "$root/cpp/apps/" 2>/dev/null | sed 's/^/ cpp\/apps\//' for proj in "$root"/projects/*/apps/; do ls "$proj" 2>/dev/null | sed "s|^| $(echo "$proj" | sed "s|$root/||")|" done } >&2 return 1 fi printf '%s\t%s\n' "$app_arg" "$app_dir" } if [ "${BASH_SOURCE[0]}" = "$0" ]; then resolve_cpp_app_dir "$@" fi