cerrado @ 3a1359b3ad03b2fdb3b9dc0df8629834f7419a08

feat: Add command to generate user passphrase
 1diff --git a/main.go b/main.go
 2index 18b73ff0fd202e715f3f6721bdc26d36fcebee0a..b891c8820f0c8bfd61b4d58dbaa6460d2531796e 100644
 3--- a/main.go
 4+++ b/main.go
 5@@ -3,10 +3,13 @@
 6 import (
 7 	"context"
 8 	"flag"
 9+	"fmt"
10 	"log/slog"
11 	"os"
12 	"os/signal"
13 	"time"
14+
15+	"golang.org/x/crypto/bcrypt"
16 
17 	"git.gabrielgio.me/cerrado/pkg/config"
18 	"git.gabrielgio.me/cerrado/pkg/handler"
19@@ -17,10 +20,30 @@
20 func main() {
21 	ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt, os.Kill)
22 	defer stop()
23+
24+	if len(os.Args) == 4 && os.Args[1] == "hash" {
25+		err := hash(os.Args[2], os.Args[3])
26+		if err != nil {
27+			slog.Error("Error", "error", err)
28+			os.Exit(1)
29+		}
30+		return
31+	}
32+
33 	if err := run(ctx); err != nil {
34 		slog.Error("Error", "error", err)
35 		os.Exit(1)
36 	}
37+}
38+
39+func hash(username string, password string) error {
40+	passphrase := fmt.Sprintf("%s:%s", username, password)
41+	bytes, err := bcrypt.GenerateFromPassword([]byte(passphrase), 14)
42+	if err != nil {
43+		return err
44+	}
45+	fmt.Println(string(bytes))
46+	return nil
47 }
48 
49 func run(ctx context.Context) error {