diff --git a/internal/cmdline/agent.go b/internal/cmdline/agent.go index c6ed3b6..8cd6eb2 100644 --- a/internal/cmdline/agent.go +++ b/internal/cmdline/agent.go @@ -11,7 +11,7 @@ import ( var parseAgentEventCmdTrie cmdtrie.StaticCommandTrie[any] = cmdtrie.NewStaticCommandTrie[any]() func AgentPostEvent(ctx CommandContext, nodeID int, args []string) error { - ret, err := parseAgentEventCmdTrie.Execute(args...) + ret, err := parseAgentEventCmdTrie.Execute(args, cmdtrie.ExecuteOption{ReplaceEmptyArrayWithNil: true}) if err != nil { return fmt.Errorf("execute parsing event command failed, err: %w", err) } diff --git a/internal/cmdline/bucket.go b/internal/cmdline/bucket.go index 6366b74..c6f326b 100644 --- a/internal/cmdline/bucket.go +++ b/internal/cmdline/bucket.go @@ -4,13 +4,12 @@ import ( "fmt" "github.com/jedib0t/go-pretty/v6/table" - "gitlink.org.cn/cloudream/client/internal/services" ) -func (c *Commandline) ListUserBuckets() error { +func BucketListUserBuckets(ctx CommandContext) error { userID := 0 - buckets, err := services.BucketSvc(c.Svc).GetUserBuckets(userID) + buckets, err := ctx.Cmdline.Svc.BucketSvc().GetUserBuckets(userID) if err != nil { return err } @@ -28,10 +27,10 @@ func (c *Commandline) ListUserBuckets() error { return nil } -func (c *Commandline) CreateBucket(bucketName string) error { +func BucketCreateBucket(ctx CommandContext, bucketName string) error { userID := 0 - bucketID, err := services.BucketSvc(c.Svc).CreateBucket(userID, bucketName) + bucketID, err := ctx.Cmdline.Svc.BucketSvc().CreateBucket(userID, bucketName) if err != nil { return err } @@ -40,10 +39,10 @@ func (c *Commandline) CreateBucket(bucketName string) error { return nil } -func (c *Commandline) DeleteBucket(bucketID int) error { +func BucketDeleteBucket(ctx CommandContext, bucketID int) error { userID := 0 - err := services.BucketSvc(c.Svc).DeleteBucket(userID, bucketID) + err := ctx.Cmdline.Svc.BucketSvc().DeleteBucket(userID, bucketID) if err != nil { return err } @@ -51,3 +50,11 @@ func (c *Commandline) DeleteBucket(bucketID int) error { fmt.Printf("Delete bucket %d success ", bucketID) return nil } + +func init() { + commands.MustAdd(BucketListUserBuckets, "bucket", "ls") + + commands.MustAdd(BucketCreateBucket, "bucket", "new") + + commands.MustAdd(BucketDeleteBucket, "bucket", "delete") +} diff --git a/internal/cmdline/commandline.go b/internal/cmdline/commandline.go index 2ba55df..f150efb 100644 --- a/internal/cmdline/commandline.go +++ b/internal/cmdline/commandline.go @@ -3,9 +3,7 @@ package cmdline import ( "fmt" "os" - "strconv" - "gitlink.org.cn/cloudream/client/internal/config" "gitlink.org.cn/cloudream/client/internal/services" "gitlink.org.cn/cloudream/common/pkg/cmdtrie" ) @@ -27,166 +25,17 @@ func NewCommandline(svc *services.Service) (*Commandline, error) { } func (c *Commandline) DispatchCommand(allArgs []string) { - cmd := allArgs[0] - args := allArgs[1:] - - switch cmd { - case "read": - objectID, err := strconv.Atoi(args[1]) - if err != nil { - fmt.Printf("invalid object id %s, err: %s", args[1], err.Error()) - os.Exit(1) - } - - if err := c.Read(args[0], objectID); err != nil { - fmt.Printf("read failed, err: %s", err.Error()) - os.Exit(1) - } - - case "write": - bucketID, err := strconv.Atoi(args[1]) - if err != nil { - fmt.Printf("invalid bucket id %s, err: %s", args[1], err.Error()) - os.Exit(1) - } - repCount, _ := strconv.Atoi(args[3]) - if repCount <= 0 || repCount > config.Cfg().MaxRepCount { - fmt.Printf("replicate number should not be more than %d", config.Cfg().MaxRepCount) - os.Exit(1) - } - - if err := c.RepWrite(args[0], bucketID, args[2], repCount); err != nil { - fmt.Printf("rep write failed, err: %s", err.Error()) - os.Exit(1) - } - case "ecWrite": - bucketID, err := strconv.Atoi(args[1]) - if err != nil { - fmt.Printf("invalid bucket id %s, err: %s", args[1], err.Error()) - os.Exit(1) - } - if err := c.EcWrite(args[0], bucketID, args[2], args[3]); err != nil { - fmt.Printf("ec write failed, err: %s", err.Error()) - os.Exit(1) - } - - case "storage": - if len(args) == 0 { - fmt.Printf("need more arg") - os.Exit(1) - } - cmd := args[0] - - switch cmd { - case "move": - objectID, err := strconv.Atoi(args[1]) - if err != nil { - fmt.Printf("invalid object id %s, err: %s", args[1], err.Error()) - os.Exit(1) - } - stgID, err := strconv.Atoi(args[2]) - if err != nil { - fmt.Printf("invalid storage id %s, err: %s", args[2], err.Error()) - os.Exit(1) - } - - if err := c.MoveObjectToStorage(objectID, stgID); err != nil { - fmt.Printf("move failed, err: %s", err.Error()) - os.Exit(1) - } - } - - case "bucket": - if len(args) == 0 { - fmt.Printf("need more arg") - os.Exit(1) - } - cmd := args[0] - - switch cmd { - case "ls": - if err := c.ListUserBuckets(); err != nil { - fmt.Printf("get user buckets failed, err: %s", err.Error()) - os.Exit(1) - } - - case "new": - if err := c.CreateBucket(args[1]); err != nil { - fmt.Printf("create bucket failed, err: %s", err.Error()) - os.Exit(1) - } - - case "delete": - bucketID, err := strconv.Atoi(args[1]) - if err != nil { - fmt.Printf("invalid bucket id %s, err: %s", args[1], err.Error()) - os.Exit(1) - } - - if err := c.DeleteBucket(bucketID); err != nil { - fmt.Printf("delete bucket failed, err: %s", err.Error()) - os.Exit(1) - } - } - - case "object": - if len(args) == 0 { - fmt.Printf("need more arg") - os.Exit(1) - } - - switch args[0] { - case "ls": - bucketID, err := strconv.Atoi(args[1]) - if err != nil { - fmt.Printf("invalid bucket id %s, err: %s", args[1], err.Error()) - os.Exit(1) - } - - if err := c.ListBucketObjects(bucketID); err != nil { - fmt.Printf("get bucket objects failed, err: %s", err.Error()) - os.Exit(1) - } - - case "update": - objectID, err := strconv.Atoi(args[1]) - if err != nil { - fmt.Printf("invalid object id %s, err: %s", args[1], err.Error()) - os.Exit(1) - } - - if err := c.UpdateRepObject(objectID, args[2]); err != nil { - fmt.Printf("delete object failed, err: %s", err.Error()) - os.Exit(1) - } - - case "delete": - objectID, err := strconv.Atoi(args[1]) - if err != nil { - fmt.Printf("invalid object id %s, err: %s", args[1], err.Error()) - os.Exit(1) - } - - if err := c.DeleteObject(objectID); err != nil { - fmt.Printf("delete object failed, err: %s", err.Error()) - os.Exit(1) - } - } - - default: - // TODO 将上面的命令也用cmdTrie管理 - cmdCtx := CommandContext{ - Cmdline: c, - } - cmdErr, err := commands.Execute(cmdCtx, allArgs...) - if err != nil { - fmt.Printf("execute command failed, err: %s", err.Error()) - os.Exit(1) - } - if cmdErr != nil { - fmt.Printf("execute command failed, err: %s", err.Error()) - os.Exit(1) - } + // TODO 需要区分nil数组和空数组 + cmdCtx := CommandContext{ + Cmdline: c, + } + cmdErr, err := commands.Execute(cmdCtx, allArgs, cmdtrie.ExecuteOption{ReplaceEmptyArrayWithNil: true}) + if err != nil { + fmt.Printf("execute command failed, err: %s", err.Error()) + os.Exit(1) + } + if cmdErr != nil { + fmt.Printf("execute command failed, err: %s", cmdErr.Error()) + os.Exit(1) } - } diff --git a/internal/cmdline/object.go b/internal/cmdline/object.go index 8523843..a83002a 100644 --- a/internal/cmdline/object.go +++ b/internal/cmdline/object.go @@ -7,13 +7,12 @@ import ( "path/filepath" "github.com/jedib0t/go-pretty/v6/table" - "gitlink.org.cn/cloudream/client/internal/services" ) -func (c *Commandline) ListBucketObjects(bucketID int) error { +func ObjectListBucketObjects(ctx CommandContext, bucketID int) error { userID := 0 - objects, err := services.BucketSvc(c.Svc).GetBucketObjects(userID, bucketID) + objects, err := ctx.Cmdline.Svc.BucketSvc().GetBucketObjects(userID, bucketID) if err != nil { return err } @@ -31,7 +30,7 @@ func (c *Commandline) ListBucketObjects(bucketID int) error { return nil } -func (c *Commandline) Read(localFilePath string, objectID int) error { +func ObjectDownloadObject(ctx CommandContext, localFilePath string, objectID int) error { // 创建本地文件 curExecPath, err := os.Executable() if err != nil { @@ -53,7 +52,7 @@ func (c *Commandline) Read(localFilePath string, objectID int) error { defer outputFile.Close() // 下载文件 - reader, err := services.ObjectSvc(c.Svc).DownloadObject(0, objectID) + reader, err := ctx.Cmdline.Svc.ObjectSvc().DownloadObject(0, objectID) if err != nil { return fmt.Errorf("download object failed, err: %w", err) } @@ -68,7 +67,7 @@ func (c *Commandline) Read(localFilePath string, objectID int) error { return nil } -func (c *Commandline) RepWrite(localFilePath string, bucketID int, objectName string, repCount int) error { +func ObjectUploadRepObject(ctx CommandContext, localFilePath string, bucketID int, objectName string, repCount int) error { file, err := os.Open(localFilePath) if err != nil { return fmt.Errorf("open file %s failed, err: %w", localFilePath, err) @@ -81,7 +80,7 @@ func (c *Commandline) RepWrite(localFilePath string, bucketID int, objectName st } fileSize := fileInfo.Size() - err = services.ObjectSvc(c.Svc).UploadRepObject(0, bucketID, objectName, file, fileSize, repCount) + err = ctx.Cmdline.Svc.ObjectSvc().UploadRepObject(0, bucketID, objectName, file, fileSize, repCount) if err != nil { return fmt.Errorf("upload file data failed, err: %w", err) } @@ -89,12 +88,12 @@ func (c *Commandline) RepWrite(localFilePath string, bucketID int, objectName st return nil } -func (c *Commandline) EcWrite(localFilePath string, bucketID int, objectName string, ecName string) error { +func ObjectEcWrite(ctx CommandContext, localFilePath string, bucketID int, objectName string, ecName string) error { // TODO panic("not implement yet") } -func (c *Commandline) UpdateRepObject(objectID int, filePath string) error { +func ObjectUpdateRepObject(ctx CommandContext, objectID int, filePath string) error { userID := 0 file, err := os.Open(filePath) @@ -109,7 +108,7 @@ func (c *Commandline) UpdateRepObject(objectID int, filePath string) error { } fileSize := fileInfo.Size() - err = services.ObjectSvc(c.Svc).UpdateRepObject(userID, objectID, file, fileSize) + err = ctx.Cmdline.Svc.ObjectSvc().UpdateRepObject(userID, objectID, file, fileSize) if err != nil { return fmt.Errorf("update object %d failed, err: %w", objectID, err) } @@ -117,11 +116,23 @@ func (c *Commandline) UpdateRepObject(objectID int, filePath string) error { return nil } -func (c *Commandline) DeleteObject(objectID int) error { +func ObjectDeleteObject(ctx CommandContext, objectID int) error { userID := 0 - err := services.ObjectSvc(c.Svc).DeleteObject(userID, objectID) + err := ctx.Cmdline.Svc.ObjectSvc().DeleteObject(userID, objectID) if err != nil { return fmt.Errorf("delete object %d failed, err: %w", objectID, err) } return nil } + +func init() { + commands.MustAdd(ObjectListBucketObjects, "object", "ls") + + commands.MustAdd(ObjectUploadRepObject, "object", "new", "rep") + + commands.MustAdd(ObjectDownloadObject, "object", "get") + + commands.MustAdd(ObjectUpdateRepObject, "object", "update", "rep") + + commands.MustAdd(ObjectDeleteObject, "object", "delete") +} diff --git a/internal/cmdline/scanner.go b/internal/cmdline/scanner.go index 9b288c8..74f2f4d 100644 --- a/internal/cmdline/scanner.go +++ b/internal/cmdline/scanner.go @@ -11,7 +11,7 @@ import ( var parseScannerEventCmdTrie cmdtrie.StaticCommandTrie[any] = cmdtrie.NewStaticCommandTrie[any]() func ScannerPostEvent(ctx CommandContext, args []string) error { - ret, err := parseScannerEventCmdTrie.Execute(args...) + ret, err := parseScannerEventCmdTrie.Execute(args, cmdtrie.ExecuteOption{ReplaceEmptyArrayWithNil: true}) if err != nil { return fmt.Errorf("execute parsing event command failed, err: %w", err) } diff --git a/internal/cmdline/storage.go b/internal/cmdline/storage.go index d2c7aac..54caccb 100644 --- a/internal/cmdline/storage.go +++ b/internal/cmdline/storage.go @@ -1,7 +1,9 @@ package cmdline -import "gitlink.org.cn/cloudream/client/internal/services" +func StorageMoveObjectToStorage(ctx CommandContext, objectID int, storageID int) error { + return ctx.Cmdline.Svc.StorageSvc().MoveObjectToStorage(0, objectID, storageID) +} -func (c *Commandline) MoveObjectToStorage(objectID int, storageID int) error { - return services.StorageSvc(c.Svc).MoveObjectToStorage(0, objectID, storageID) +func init() { + commands.MustAdd(StorageMoveObjectToStorage, "storage", "move") } diff --git a/internal/services/bucket.go b/internal/services/bucket.go index f95fd9b..52c6179 100644 --- a/internal/services/bucket.go +++ b/internal/services/bucket.go @@ -11,7 +11,7 @@ type BucketService struct { *Service } -func BucketSvc(svc *Service) *BucketService { +func (svc *Service) BucketSvc() *BucketService { return &BucketService{Service: svc} } diff --git a/internal/services/object.go b/internal/services/object.go index 12279fb..cd85723 100644 --- a/internal/services/object.go +++ b/internal/services/object.go @@ -28,7 +28,7 @@ type ObjectService struct { *Service } -func ObjectSvc(svc *Service) *ObjectService { +func (svc *Service) ObjectSvc() *ObjectService { return &ObjectService{Service: svc} } diff --git a/internal/services/storage.go b/internal/services/storage.go index cbda021..ae85e49 100644 --- a/internal/services/storage.go +++ b/internal/services/storage.go @@ -13,7 +13,7 @@ type StorageService struct { *Service } -func StorageSvc(svc *Service) *StorageService { +func (svc *Service) StorageSvc() *StorageService { return &StorageService{Service: svc} }