package main import ( "bufio" "fmt" "io" "os" "strings" "atlas9.dev/c/demo/api/api_gen" ) const demoModule = "atlas9.dev/c/demo" func main() { if err := checkCwd(); err != nil { fmt.Fprintf(os.Stderr, "error: %s\n", err) os.Exit(1) } if err := generateApi(); err != nil { fmt.Fprintf(os.Stderr, "error: %s\n", err) os.Exit(1) } if err := copyFile("./api/generated/client.js", "./frontend/client.js"); err != nil { fmt.Fprintf(os.Stderr, "error: %s\n", err) os.Exit(1) } if err := generateDataModel(); err != nil { fmt.Fprintf(os.Stderr, "error: %s\n", err) os.Exit(1) } } func copyFile(src, dst string) error { in, err := os.Open(src) if err != nil { return fmt.Errorf("open %s: %w", src, err) } defer in.Close() out, err := os.Create(dst) if err != nil { return fmt.Errorf("create %s: %w", dst, err) } defer out.Close() if _, err := io.Copy(out, in); err != nil { return fmt.Errorf("copy %s -> %s: %w", src, dst, err) } return nil } func checkCwd() error { f, err := os.Open("go.mod") if err != nil { return fmt.Errorf("must be run from the root of the %s module: %w", demoModule, err) } defer f.Close() scanner := bufio.NewScanner(f) for scanner.Scan() { line := strings.TrimSpace(scanner.Text()) if strings.HasPrefix(line, "module ") { mod := strings.TrimSpace(strings.TrimPrefix(line, "module")) if mod != demoModule { return fmt.Errorf("must be run from the root of the %s module (found module %q)", demoModule, mod) } return nil } } if err := scanner.Err(); err != nil { return fmt.Errorf("reading go.mod: %w", err) } return fmt.Errorf("go.mod has no module directive") } func generateApi() error { return api_gen.Run(api_gen.Config{ InputDir: "./api", OutputDir: "./api/generated", Module: "atlas9.dev/c/demo/api", Formats: []string{"openapi", "docs", "client", "tsclient", "jsclient"}, Title: "Atlas9 Demo API", Version: "1.0.0", Description: "Atlas9 Demo API", ServerURL: "http://localhost:8080", ServerDescription: "Local development server", }) }