package main import ( "flag" "fmt" "log" "net/http" "os" "path/filepath" ) func main() { bind := flag.String("bind", "127.0.0.1:8484", "address to bind") flag.Parse() root := findRegistryRoot() if root == "" { log.Fatal("cannot find fn_registry root (no registry.db found). Set FN_REGISTRY_ROOT or run from the registry directory.") } pool := NewDBPool() for _, entry := range DiscoverDatabases(root) { pool.Register(entry) log.Printf("registered database: %s (%s)", entry.Alias, entry.Path) } srv := NewServer(pool, root) mux := http.NewServeMux() srv.Routes(mux) handler := corsMiddleware(mux) log.Printf("sqlite_api listening on %s (registry root: %s)", *bind, root) if err := http.ListenAndServe(*bind, handler); err != nil { log.Fatalf("server error: %v", err) } } // findRegistryRoot walks up from cwd (or uses FN_REGISTRY_ROOT) to find registry.db. func findRegistryRoot() string { if env := os.Getenv("FN_REGISTRY_ROOT"); env != "" { if _, err := os.Stat(filepath.Join(env, "registry.db")); err == nil { return env } } dir, err := os.Getwd() if err != nil { return "" } for { if _, err := os.Stat(filepath.Join(dir, "registry.db")); err == nil { return dir } parent := filepath.Dir(dir) if parent == dir { break } dir = parent } return "" } func init() { log.SetFlags(log.Ltime) log.SetPrefix("[sqlite_api] ") fmt.Fprintln(os.Stderr, "sqlite_api — HTTP API for fn_registry databases") }