123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 |
- package v2 // import "github.com/docker/docker/plugin/v2"
- import (
- "errors"
- "fmt"
- "strings"
- )
- type settable struct {
- name string
- field string
- value string
- }
- var (
- allowedSettableFieldsEnv = []string{"value"}
- allowedSettableFieldsArgs = []string{"value"}
- allowedSettableFieldsDevices = []string{"path"}
- allowedSettableFieldsMounts = []string{"source"}
- errMultipleFields = errors.New("multiple fields are settable, one must be specified")
- errInvalidFormat = errors.New("invalid format, must be <name>[.<field>][=<value>]")
- )
- func newSettables(args []string) ([]settable, error) {
- sets := make([]settable, 0, len(args))
- for _, arg := range args {
- set, err := newSettable(arg)
- if err != nil {
- return nil, err
- }
- sets = append(sets, set)
- }
- return sets, nil
- }
- func newSettable(arg string) (settable, error) {
- var set settable
- if i := strings.Index(arg, "="); i == 0 {
- return set, errInvalidFormat
- } else if i < 0 {
- set.name = arg
- } else {
- set.name = arg[:i]
- set.value = arg[i+1:]
- }
- if i := strings.LastIndex(set.name, "."); i > 0 {
- set.field = set.name[i+1:]
- set.name = arg[:i]
- }
- return set, nil
- }
- // prettyName return name.field if there is a field, otherwise name.
- func (set *settable) prettyName() string {
- if set.field != "" {
- return fmt.Sprintf("%s.%s", set.name, set.field)
- }
- return set.name
- }
- func (set *settable) isSettable(allowedSettableFields []string, settable []string) (bool, error) {
- if set.field == "" {
- if len(settable) == 1 {
- // if field is not specified and there only one settable, default to it.
- set.field = settable[0]
- } else if len(settable) > 1 {
- return false, errMultipleFields
- }
- }
- isAllowed := false
- for _, allowedSettableField := range allowedSettableFields {
- if set.field == allowedSettableField {
- isAllowed = true
- break
- }
- }
- if isAllowed {
- for _, settableField := range settable {
- if set.field == settableField {
- return true, nil
- }
- }
- }
- return false, nil
- }
- func updateSettingsEnv(env *[]string, set *settable) {
- for i, e := range *env {
- if name, _, _ := strings.Cut(e, "="); name == set.name {
- (*env)[i] = set.name + "=" + set.value
- return
- }
- }
- *env = append(*env, set.name+"="+set.value)
- }
|