// FIXME(thaJeztah): remove once we are a module; the go:build directive prevents go from downgrading language version to go1.16: //go:build go1.26 package opts import ( "fmt" "maps" "slices" "strings" "github.com/docker/go-units" "github.com/moby/moby/api/types/container" ) // UlimitOpt defines a map of Ulimits type UlimitOpt struct { values *map[string]*container.Ulimit } // NewUlimitOpt creates a new UlimitOpt. Ulimits are not validated. func NewUlimitOpt(ref *map[string]*container.Ulimit) *UlimitOpt { // TODO(thaJeztah): why do we need a map with pointers here? if ref == nil { ref = &map[string]*container.Ulimit{} } return &UlimitOpt{ref} } // Set validates a Ulimit and sets its name as a key in UlimitOpt func (o *UlimitOpt) Set(val string) error { // FIXME(thaJeztah): these functions also need to be moved over from go-units. l, err := units.ParseUlimit(val) if err != nil { return err } (*o.values)[l.Name] = l return nil } // String returns Ulimit values as a string. Values are sorted by name. func (o *UlimitOpt) String() string { out := make([]string, 0, len(*o.values)) for _, v := range *o.values { out = append(out, v.String()) } slices.Sort(out) return fmt.Sprint(out) } // GetList returns a slice of pointers to Ulimits. Values are sorted by name. func (o *UlimitOpt) GetList() []*container.Ulimit { return slices.SortedFunc(maps.Values(*o.values), func(a, b *container.Ulimit) int { return strings.Compare(a.Name, b.Name) }) } // Type returns the option type func (*UlimitOpt) Type() string { return "ulimit" }