| package op |
|
|
| import ( |
| "reflect" |
| "strings" |
|
|
| "github.com/alist-org/alist/v3/internal/conf" |
| "github.com/alist-org/alist/v3/internal/driver" |
| "github.com/pkg/errors" |
| ) |
|
|
| type DriverConstructor func() driver.Driver |
|
|
| var driverMap = map[string]DriverConstructor{} |
| var driverInfoMap = map[string]driver.Info{} |
|
|
| func RegisterDriver(driver DriverConstructor) { |
| |
| tempDriver := driver() |
| tempConfig := tempDriver.Config() |
| registerDriverItems(tempConfig, tempDriver.GetAddition()) |
| driverMap[tempConfig.Name] = driver |
| } |
|
|
| func GetDriver(name string) (DriverConstructor, error) { |
| n, ok := driverMap[name] |
| if !ok { |
| return nil, errors.Errorf("no driver named: %s", name) |
| } |
| return n, nil |
| } |
|
|
| func GetDriverNames() []string { |
| var driverNames []string |
| for k := range driverInfoMap { |
| driverNames = append(driverNames, k) |
| } |
| return driverNames |
| } |
|
|
| func GetDriverInfoMap() map[string]driver.Info { |
| return driverInfoMap |
| } |
|
|
| func registerDriverItems(config driver.Config, addition driver.Additional) { |
| |
| tAddition := reflect.TypeOf(addition) |
| for tAddition.Kind() == reflect.Pointer { |
| tAddition = tAddition.Elem() |
| } |
| mainItems := getMainItems(config) |
| additionalItems := getAdditionalItems(tAddition, config.DefaultRoot) |
| driverInfoMap[config.Name] = driver.Info{ |
| Common: mainItems, |
| Additional: additionalItems, |
| Config: config, |
| } |
| } |
|
|
| func getMainItems(config driver.Config) []driver.Item { |
| items := []driver.Item{{ |
| Name: "mount_path", |
| Type: conf.TypeString, |
| Required: true, |
| Help: "The path you want to mount to, it is unique and cannot be repeated", |
| }, { |
| Name: "order", |
| Type: conf.TypeNumber, |
| Help: "use to sort", |
| }, { |
| Name: "remark", |
| Type: conf.TypeText, |
| }, { |
| Name: "group", |
| Type: conf.TypeString, |
| Default: "未分组", |
| }, { |
| Name: "sync_group", |
| Type: conf.TypeBool, |
| Default: "false", |
| Help: "同时修改同组内所有存储", |
| }} |
| if !config.NoCache { |
| items = append(items, driver.Item{ |
| Name: "cache_expiration", |
| Type: conf.TypeNumber, |
| Default: "30", |
| Required: true, |
| Help: "The cache expiration time for this storage", |
| }) |
| } |
| if !config.OnlyProxy && !config.OnlyLocal { |
| items = append(items, []driver.Item{{ |
| Name: "web_proxy", |
| Type: conf.TypeBool, |
| }, { |
| Name: "webdav_policy", |
| Type: conf.TypeSelect, |
| Options: "302_redirect,use_proxy_url,native_proxy", |
| Default: "302_redirect", |
| Required: true, |
| }, |
| }...) |
| } else { |
| items = append(items, driver.Item{ |
| Name: "webdav_policy", |
| Type: conf.TypeSelect, |
| Default: "native_proxy", |
| Options: "use_proxy_url,native_proxy", |
| Required: true, |
| }) |
| } |
| items = append(items, driver.Item{ |
| Name: "down_proxy_url", |
| Type: conf.TypeText, |
| }) |
| if config.LocalSort { |
| items = append(items, []driver.Item{{ |
| Name: "order_by", |
| Type: conf.TypeSelect, |
| Options: "name,size,modified", |
| }, { |
| Name: "order_direction", |
| Type: conf.TypeSelect, |
| Options: "asc,desc", |
| }}...) |
| } |
| items = append(items, driver.Item{ |
| Name: "extract_folder", |
| Type: conf.TypeSelect, |
| Options: "front,back", |
| }) |
| items = append(items, driver.Item{ |
| Name: "enable_sign", |
| Type: conf.TypeBool, |
| Default: "false", |
| Required: true, |
| }) |
| return items |
| } |
| func getAdditionalItems(t reflect.Type, defaultRoot string) []driver.Item { |
| var items []driver.Item |
| for i := 0; i < t.NumField(); i++ { |
| field := t.Field(i) |
| if field.Type.Kind() == reflect.Struct { |
| items = append(items, getAdditionalItems(field.Type, defaultRoot)...) |
| continue |
| } |
| tag := field.Tag |
| ignore, ok1 := tag.Lookup("ignore") |
| name, ok2 := tag.Lookup("json") |
| if (ok1 && ignore == "true") || !ok2 { |
| continue |
| } |
| item := driver.Item{ |
| Name: name, |
| Type: strings.ToLower(field.Type.Name()), |
| Default: tag.Get("default"), |
| Options: tag.Get("options"), |
| Required: tag.Get("required") == "true", |
| Help: tag.Get("help"), |
| } |
| if tag.Get("type") != "" { |
| item.Type = tag.Get("type") |
| } |
| if item.Name == "root_folder_id" || item.Name == "root_folder_path" { |
| if item.Default == "" { |
| item.Default = defaultRoot |
| } |
| item.Required = item.Default != "" |
| } |
| |
| if item.Type == "" { |
| item.Type = "string" |
| } |
| items = append(items, item) |
| } |
| return items |
| } |
|
|