package cli import ( "context" "fmt" "git.eeqj.de/sneak/vaultik/internal/config" "git.eeqj.de/sneak/vaultik/internal/globals" "github.com/spf13/cobra" "go.uber.org/fx" ) // BackupOptions contains options for the backup command type BackupOptions struct { ConfigPath string Daemon bool Cron bool } // NewBackupCommand creates the backup command func NewBackupCommand() *cobra.Command { opts := &BackupOptions{} cmd := &cobra.Command{ Use: "backup ", Short: "Perform incremental backup", Long: `Backup configured directories using incremental deduplication and encryption`, Args: cobra.ExactArgs(1), RunE: func(cmd *cobra.Command, args []string) error { opts.ConfigPath = args[0] return runBackup(cmd.Context(), opts) }, } cmd.Flags().BoolVar(&opts.Daemon, "daemon", false, "Run in daemon mode with inotify monitoring") cmd.Flags().BoolVar(&opts.Cron, "cron", false, "Run in cron mode (silent unless error)") return cmd } func runBackup(ctx context.Context, opts *BackupOptions) error { app := fx.New( fx.Supply(config.ConfigPath(opts.ConfigPath)), fx.Provide(globals.New), config.Module, // Additional modules will be added here fx.Invoke(func(g *globals.Globals, cfg *config.Config) error { // TODO: Implement backup logic fmt.Printf("Running backup with config: %s\n", opts.ConfigPath) fmt.Printf("Version: %s, Commit: %s\n", g.Version, g.Commit) if opts.Daemon { fmt.Println("Running in daemon mode") } if opts.Cron { fmt.Println("Running in cron mode") } return nil }), fx.NopLogger, ) if err := app.Start(ctx); err != nil { return fmt.Errorf("failed to start backup: %w", err) } defer func() { if err := app.Stop(ctx); err != nil { fmt.Printf("error stopping app: %v\n", err) } }() return nil }