-
-
Notifications
You must be signed in to change notification settings - Fork 75
/
Copy pathmain.go
97 lines (82 loc) · 1.98 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
package main
import (
"context"
"errors"
"flag"
"fmt"
"os"
"os/signal"
"github.com/simulot/immich-go/cmd"
"github.com/simulot/immich-go/cmd/duplicate"
"github.com/simulot/immich-go/cmd/metadata"
"github.com/simulot/immich-go/cmd/stack"
"github.com/simulot/immich-go/cmd/tool"
"github.com/simulot/immich-go/cmd/upload"
"github.com/simulot/immich-go/logger"
)
var (
version = "dev"
commit = "none"
date = "unknown"
)
func main() {
var err error
fmt.Printf("immich-go %s, commit %s, built at %s\n", version, commit, date)
// Create a context with cancel function to gracefully handle Ctrl+C events
ctx, cancel := context.WithCancel(context.Background())
// Handle Ctrl+C signal (SIGINT)
signalChannel := make(chan os.Signal, 1)
signal.Notify(signalChannel, os.Interrupt)
go func() {
<-signalChannel
fmt.Println("\nCtrl+C received. Shutting down...")
cancel() // Cancel the context when Ctrl+C is received
}()
select {
case <-ctx.Done():
err = ctx.Err()
default:
err = Run(ctx)
}
if err != nil {
os.Exit(1)
}
}
func Run(ctx context.Context) error {
log := logger.NewLogger(logger.OK, true, false)
defer log.Close()
app := cmd.SharedFlags{
Jnl: logger.NewJournal(log),
}
fs := flag.NewFlagSet("main", flag.ExitOnError)
app.SetFlags(fs)
err := fs.Parse(os.Args[1:])
if err != nil {
return err
}
if len(fs.Args()) == 0 {
err = errors.Join(err, errors.New("missing command upload|duplicate|stack|tool"))
}
if err != nil {
return err
}
cmd := fs.Args()[0]
switch cmd {
case "upload":
err = upload.UploadCommand(ctx, &app, fs.Args()[1:])
case "duplicate":
err = duplicate.DuplicateCommand(ctx, &app, fs.Args()[1:])
case "metadata":
err = metadata.MetadataCommand(ctx, &app, fs.Args()[1:])
case "stack":
err = stack.NewStackCommand(ctx, &app, fs.Args()[1:])
case "tool":
err = tool.CommandTool(ctx, &app, fs.Args()[1:])
default:
err = fmt.Errorf("unknown command: %q", cmd)
}
if err != nil {
log.Error(err.Error())
}
return err
}