discrawl/internal/cli/share_update.go
2026-05-05 10:07:56 +01:00

111 lines
2.6 KiB
Go

package cli
import (
"errors"
"fmt"
"strings"
"time"
"github.com/openclaw/discrawl/internal/share"
)
type shareUpdateMode string
const (
shareUpdateConfigured shareUpdateMode = "configured"
shareUpdateAuto shareUpdateMode = "auto"
shareUpdateNever shareUpdateMode = "never"
shareUpdateForce shareUpdateMode = "force"
)
func boolShareUpdateMode(enabled bool) shareUpdateMode {
if enabled {
return shareUpdateConfigured
}
return shareUpdateNever
}
func parseShareUpdateMode(raw string) (shareUpdateMode, error) {
switch shareUpdateMode(strings.ToLower(strings.TrimSpace(raw))) {
case "", shareUpdateAuto:
return shareUpdateAuto, nil
case shareUpdateNever:
return shareUpdateNever, nil
case shareUpdateForce:
return shareUpdateForce, nil
default:
return "", fmt.Errorf("invalid --update %q; use auto, never, or force", raw)
}
}
func syncShareUpdateMode(args []string) (shareUpdateMode, error) {
mode := shareUpdateNever
sawNoUpdate := false
sawUpdate := false
for i := 0; i < len(args); i++ {
arg := args[i]
switch {
case arg == "--no-update":
sawNoUpdate = true
mode = shareUpdateNever
case arg == "--update":
if i+1 >= len(args) {
return "", errors.New("--update requires auto, never, or force")
}
parsed, err := parseShareUpdateMode(args[i+1])
if err != nil {
return "", err
}
sawUpdate = true
mode = parsed
i++
case strings.HasPrefix(arg, "--update="):
parsed, err := parseShareUpdateMode(strings.TrimPrefix(arg, "--update="))
if err != nil {
return "", err
}
sawUpdate = true
mode = parsed
}
}
if sawNoUpdate && sawUpdate && mode != shareUpdateNever {
return "", errors.New("use either --no-update or --update, not both")
}
return mode, nil
}
func (r *runtime) shareProgress(progress share.ImportProgress) {
if progress.Phase == "" {
return
}
phase := "share " + progress.Phase
if progress.Table != "" {
phase += " " + progress.Table
}
if progress.File != "" {
phase += " " + progress.File
}
r.setSyncLockPhase(phase)
attrs := []any{"phase", progress.Phase}
if progress.Table != "" {
attrs = append(attrs, "table", progress.Table)
}
if progress.Rows != 0 {
attrs = append(attrs, "rows", progress.Rows)
}
if progress.TotalRows != 0 {
attrs = append(attrs, "total_rows", progress.TotalRows)
}
if progress.File != "" {
attrs = append(attrs, "file", progress.File, "file_index", progress.FileIndex, "file_count", progress.FileCount)
}
r.logger.Info("share import progress", attrs...)
}
func (r *runtime) nowUTC() time.Time {
if r.now != nil {
return r.now().UTC()
}
return time.Now().UTC()
}