|
- package rclone
-
- import (
- "context"
- "fmt"
-
- _ "github.com/rclone/rclone/backend/all"
- "github.com/rclone/rclone/fs"
- "github.com/rclone/rclone/fs/config/configmap"
- "gitlink.org.cn/cloudream/jcs-pub/common/pkgs/storage/factory/reg"
- stgtypes "gitlink.org.cn/cloudream/jcs-pub/common/pkgs/storage/types"
- jcstypes "gitlink.org.cn/cloudream/jcs-pub/common/types"
- )
-
- func init() {
- reg.RegisterBuilder[*jcstypes.RCloneType](func(detail *jcstypes.UserSpaceDetail) stgtypes.StorageBuilder {
- return &Builder{
- Detail: detail,
- }
- })
- }
-
- type Builder struct {
- stgtypes.EmptyBuilder
- Detail *jcstypes.UserSpaceDetail
- }
-
- func (b *Builder) FeatureDesc() stgtypes.FeatureDesc {
- return stgtypes.FeatureDesc{}
- }
-
- func (b *Builder) CreateShardStore(typeOnly bool) (stgtypes.ShardStore, error) {
- stgType := b.Detail.UserSpace.Storage.(*jcstypes.RCloneType)
- cred, ok := b.Detail.UserSpace.Credential.(*jcstypes.RCloneCred)
- if !ok {
- return nil, fmt.Errorf("invalid storage credential type %T for rclone storage", b.Detail.UserSpace.Credential)
- }
-
- if typeOnly {
- return (*ShardStore)(nil), nil
- }
-
- fs, err := createFs(stgType.BackendType, stgType.Root, cred.BackendConfig)
- if err != nil {
- return nil, err
- }
-
- return NewShardStore(fs, b.Detail), nil
- }
-
- func (b *Builder) CreateBaseStore(typeOnly bool) (stgtypes.BaseStore, error) {
- stgType := b.Detail.UserSpace.Storage.(*jcstypes.RCloneType)
- cred, ok := b.Detail.UserSpace.Credential.(*jcstypes.RCloneCred)
- if !ok {
- return nil, fmt.Errorf("invalid storage credential type %T for rclone storage", b.Detail.UserSpace.Credential)
- }
- if typeOnly {
- return (*BaseStore)(nil), nil
- }
-
- fs, err := createFs(stgType.BackendType, stgType.Root, cred.BackendConfig)
- if err != nil {
- return nil, err
- }
-
- return NewBaseStore(fs, b.Detail), nil
- }
-
- func createFs(typ string, root string, config map[string]string) (fs.Fs, error) {
- for _, f := range fs.Registry {
- if f.Name == typ {
- return f.NewFs(context.Background(), "", root, configmap.Simple(config))
- }
- }
-
- return nil, fmt.Errorf("backend %v not found", typ)
- }
|