mirror of
https://github.com/photoprism/photoprism.git
synced 2025-09-30 14:44:41 +08:00
178 lines
3.9 KiB
Go
178 lines
3.9 KiB
Go
package config
|
|
|
|
import (
|
|
"reflect"
|
|
"strings"
|
|
|
|
"github.com/urfave/cli/v2"
|
|
|
|
"github.com/photoprism/photoprism/pkg/clean"
|
|
"github.com/photoprism/photoprism/pkg/list"
|
|
)
|
|
|
|
func firstName(names string) string {
|
|
if n := strings.Split(names, ","); len(n) > 0 {
|
|
return strings.TrimSpace(n[0])
|
|
}
|
|
|
|
return ""
|
|
}
|
|
|
|
// CliFlags represents a list of command-line parameters.
|
|
type CliFlags []CliFlag
|
|
|
|
// Cli returns the currently active command-line parameters.
|
|
func (f CliFlags) Cli() (result []cli.Flag) {
|
|
result = make([]cli.Flag, 0, len(f))
|
|
|
|
for _, flag := range f {
|
|
result = append(result, flag.Flag)
|
|
}
|
|
|
|
return result
|
|
}
|
|
|
|
// Find finds command-line parameters based on a list of tags.
|
|
func (f CliFlags) Find(tags []string) (result []cli.Flag) {
|
|
result = make([]cli.Flag, 0, len(f))
|
|
|
|
for _, flag := range f {
|
|
if len(flag.Tags) > 0 && !list.ContainsAny(flag.Tags, tags) {
|
|
continue
|
|
}
|
|
|
|
result = append(result, flag.Flag)
|
|
}
|
|
|
|
return result
|
|
}
|
|
|
|
// Remove removes command flags by name.
|
|
func (f CliFlags) Remove(names []string) (result CliFlags) {
|
|
result = make(CliFlags, 0, len(f))
|
|
|
|
for _, flag := range f {
|
|
if list.ContainsAny(names, []string{flag.Name(), flag.String()}) {
|
|
continue
|
|
}
|
|
|
|
result = append(result, flag)
|
|
}
|
|
|
|
return result
|
|
}
|
|
|
|
// Replace replaces an existing command flag by name and returns true if successful.
|
|
func (f CliFlags) Replace(name string, replacement CliFlag) CliFlags {
|
|
if name = firstName(name); name == "" {
|
|
log.Warnf("config: invalid name provided to replace cli flag %s", clean.Log(name))
|
|
return f
|
|
}
|
|
|
|
done := false
|
|
|
|
if name = firstName(name); name != "" {
|
|
for i, flag := range f {
|
|
if !done && flag.Name() == name {
|
|
f[i] = replacement
|
|
done = true
|
|
}
|
|
}
|
|
}
|
|
|
|
if !done {
|
|
log.Warnf("config: failed to replace cli flag %s", clean.Log(name))
|
|
}
|
|
|
|
return f
|
|
}
|
|
|
|
// Insert inserts command flags, if possible after the flag specified by name.
|
|
func (f CliFlags) Insert(name string, insert []CliFlag) (result CliFlags) {
|
|
if name = firstName(name); name == "" {
|
|
log.Warnf("config: invalid name provided to insert cli flag after %s", clean.Log(name))
|
|
return f
|
|
}
|
|
|
|
result = make(CliFlags, 0, len(f)+len(insert))
|
|
done := false
|
|
|
|
for _, flag := range f {
|
|
result = append(result, flag)
|
|
|
|
if !done && flag.Name() == name {
|
|
result = append(result, insert...)
|
|
done = true
|
|
}
|
|
}
|
|
|
|
if !done {
|
|
log.Warnf("config: failed to insert cli flags after %s", clean.Log(name))
|
|
result = append(result, insert...)
|
|
}
|
|
|
|
return result
|
|
}
|
|
|
|
// InsertBefore inserts command flags, if possible before the flag specified by name.
|
|
func (f CliFlags) InsertBefore(name string, insert []CliFlag) (result CliFlags) {
|
|
if name = firstName(name); name == "" {
|
|
log.Warnf("config: invalid name provided to insert cli flag before %s", clean.Log(name))
|
|
return f
|
|
}
|
|
|
|
result = make(CliFlags, 0, len(f)+len(insert))
|
|
done := false
|
|
|
|
for _, flag := range f {
|
|
if !done && flag.Name() == name {
|
|
result = append(result, insert...)
|
|
done = true
|
|
}
|
|
|
|
result = append(result, flag)
|
|
}
|
|
|
|
if !done {
|
|
log.Warnf("config: failed to insert cli flags before %s", clean.Log(name))
|
|
result = append(result, insert...)
|
|
}
|
|
|
|
return result
|
|
}
|
|
|
|
// Prepend adds command flags at the beginning.
|
|
func (f CliFlags) Prepend(el []CliFlag) (result CliFlags) {
|
|
result = make(CliFlags, 0, len(f)+len(el))
|
|
|
|
result = append(result, el...)
|
|
return append(result, f...)
|
|
}
|
|
|
|
// SetHidden updates the hidden property of the config flags to the specified value.
|
|
func (f CliFlags) SetHidden(hidden bool, names ...string) (result CliFlags) {
|
|
result = make(CliFlags, 0, len(f))
|
|
|
|
for _, flag := range f {
|
|
if list.Contains(names, flag.Name()) {
|
|
rv := reflect.ValueOf(flag.Flag)
|
|
|
|
if rv.Kind() == reflect.Ptr {
|
|
rv = rv.Elem()
|
|
}
|
|
|
|
if rv.Kind() == reflect.Struct {
|
|
field := rv.FieldByName("Hidden")
|
|
|
|
if field.IsValid() && field.CanSet() && field.Kind() == reflect.Bool {
|
|
field.SetBool(hidden)
|
|
}
|
|
}
|
|
}
|
|
|
|
result = append(result, flag)
|
|
}
|
|
|
|
return result
|
|
}
|