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  }