this repo has no description
1package main
2
3import (
4 "context"
5 "flag"
6 "log/slog"
7 "os"
8 "strconv"
9 "time"
10
11 "github.com/eagleusb/proxycon/internal/data"
12 "github.com/eagleusb/proxycon/internal/server"
13)
14
15var (
16 version = "dev"
17 buildTime = "unknown"
18)
19
20func main() {
21 port := flag.Int("port", 8080, "HTTP listening port")
22 verbose := flag.Bool("verbose", false, "enable DEBUG log level")
23 page := flag.Int("page", 10, "page size for /list endpoint")
24 versionFlag := flag.Bool("version", false, "print version and exit")
25
26 flag.Parse()
27
28 if *versionFlag {
29 slog.Info("proxycon version", "vers", version, "built", buildTime)
30 os.Exit(0)
31 }
32
33 if *port <= 1024 || *port > 65535 {
34 slog.Error("invalid port number", "port", *port)
35 os.Exit(1)
36 }
37
38 opts := &slog.HandlerOptions{Level: slog.LevelInfo}
39 if *verbose {
40 opts.Level = slog.LevelDebug
41 }
42 logger := slog.New(slog.NewTextHandler(os.Stdout, opts))
43 slog.SetDefault(logger)
44
45 datasource := data.NewBitcoinPrices()
46 ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second)
47 defer cancel()
48
49 if err := datasource.SetPrices(ctx); err != nil {
50 slog.Error("failed to fetch prices from datasource", "error", err)
51 os.Exit(1)
52 }
53
54 addr := ":" + strconv.Itoa(*port)
55 slog.Info("starting proxycon", "addr", addr, "page_size", *page, "version", version)
56 if err := server.NewServer(datasource, *page).Listen(addr); err != nil {
57 slog.Error("proxycon init failed", "error", err)
58 os.Exit(1)
59 }
60}