github.com/moby/docker@v26.1.3+incompatible/api/types/system/security_opts.go (about) 1 package system 2 3 import ( 4 "errors" 5 "fmt" 6 "strings" 7 ) 8 9 // SecurityOpt contains the name and options of a security option 10 type SecurityOpt struct { 11 Name string 12 Options []KeyValue 13 } 14 15 // DecodeSecurityOptions decodes a security options string slice to a 16 // type-safe [SecurityOpt]. 17 func DecodeSecurityOptions(opts []string) ([]SecurityOpt, error) { 18 so := []SecurityOpt{} 19 for _, opt := range opts { 20 // support output from a < 1.13 docker daemon 21 if !strings.Contains(opt, "=") { 22 so = append(so, SecurityOpt{Name: opt}) 23 continue 24 } 25 secopt := SecurityOpt{} 26 for _, s := range strings.Split(opt, ",") { 27 k, v, ok := strings.Cut(s, "=") 28 if !ok { 29 return nil, fmt.Errorf("invalid security option %q", s) 30 } 31 if k == "" || v == "" { 32 return nil, errors.New("invalid empty security option") 33 } 34 if k == "name" { 35 secopt.Name = v 36 continue 37 } 38 secopt.Options = append(secopt.Options, KeyValue{Key: k, Value: v}) 39 } 40 so = append(so, secopt) 41 } 42 return so, nil 43 } 44 45 // KeyValue holds a key/value pair. 46 type KeyValue struct { 47 Key, Value string 48 }