agent/session/plugin/cli/flag_set.go (110 lines of code) (raw):
// Copyright (c) 2009-present, Alibaba Cloud All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package cli
import (
"fmt"
"strings"
)
type FlagSet struct {
// flags
flags []*Flag
// key: "--name" "-c"
index map[string]*Flag
}
func NewFlagSet() *FlagSet {
return &FlagSet{
flags: make([]*Flag, 0),
index: make(map[string]*Flag),
}
}
//
// traverse all values
func (fs *FlagSet) Flags() []*Flag {
return fs.flags
}
//
// call from user program, if flag duplicated, panic!
func (fs *FlagSet) Add(f *Flag) {
f.checkValid()
for _, s := range f.GetFormations() {
if _, ok := fs.index[s]; ok {
panic(fmt.Errorf("flag duplicated %s", string(s)))
}
fs.index[s] = f
}
fs.flags = append(fs.flags, f)
}
//
// add by name, not support add by shorthand
func (fs *FlagSet) AddByName(name string) (*Flag, error) {
if _, ok := fs.index["--"+name]; ok {
return nil, fmt.Errorf("flag duplicated --%s", name)
}
f := &Flag{
Name: name,
}
if strings.HasSuffix(name, "-FILE") {
f.Aliases = append(f.Aliases, strings.TrimSuffix(name, "-FILE"))
}
fs.Add(f)
return f, nil
}
//
// get flag by name, sample --name
func (fs *FlagSet) Get(name string) *Flag {
if f, ok := fs.index["--"+name]; ok {
f.formation = "--" + name
return f
}
return nil
}
//
// get flag by shorthand, sample -a
func (fs *FlagSet) GetByShorthand(c rune) *Flag {
if f, ok := fs.index["-"+string(c)]; ok {
f.formation = "-" + string(c)
return f
}
return nil
}
//
// get suggestions
func (fs *FlagSet) GetSuggestions(name string, distance int) []string {
sr := NewSuggester(name, distance)
for k := range fs.index {
sr.Apply(k)
}
ss := make([]string, 0)
for _, s := range sr.GetResults() {
ss = append(ss, s)
}
return ss
}
// get value by flag name, not recommended
func (fs *FlagSet) GetValue(name string) (string, bool) {
f := fs.Get(name)
if f == nil {
return "", false
}
return f.GetValue()
}
//
//// get value by flag name, if not assigned return default value
//func (a *FlagSet) GetStringOrDefault(name string, def string) string {
// v, ok := a.GetValue(name)
// if ok {
// return v
// } else {
// return def
// }
//}
//// put value
//// return: if duplicated return error
//func (a *FlagSet) PutValue(name string, value string) error {
// f := a.Get(name)
// if f != nil {
// return f.putValue(value)
// } else {
// f := Flag{
// Name: name,
// value: value,
// }
// a.flags = append(a.flags, f)
// return nil
// }
//}
//func (fs *FlagSet) StringVar(p *string, name string, defaultValue string, usage *i18n.Text) *Flag {
// f := &Flag{
// Name: name,
// Short: usage,
// DefaultValue: defaultValue,
// Required: false,
// AssignedMode: AssignedOnce,
// Persistent: false,
// p: p,
// }
// fs.Add(f)
// return f
//}
//
//func (fs *FlagSet) PersistentStringVar(p *string, name string, defaultValue string, usage *i18n.Text) *Flag {
// f := &Flag{
// Name: name,
// Short: usage,
// DefaultValue: defaultValue,
// Required: false,
// AssignedMode: AssignedOnce,
// Persistent: true,
// p: p,
// }
// fs.Add(f)
// return f
//}
// get assigned count for flags
func (fs *FlagSet) assignedCount() int {
n := 0
for _, f := range fs.flags {
if f.assigned {
n++
}
}
return n
}
//
// merge FlagSet with from
func (fs *FlagSet) mergeWith(from *FlagSet, applier func(f *Flag) bool) *FlagSet {
if from == nil {
return fs
}
r := NewFlagSet()
if fs != nil {
for _, f := range fs.flags {
r.Add(f)
}
}
for _, rv := range from.Flags() {
if applier(rv) {
r.put(rv)
}
}
return r
}
// put flag, replace old value if duplicated
func (fs *FlagSet) put(f *Flag) {
for _, lv := range fs.flags {
if lv == f {
return
}
}
fs.flags = append(fs.flags, f)
for _, s := range f.GetFormations() {
fs.index[s] = f
}
}