package service // import "github.com/docker/docker/volume/service" import ( "github.com/docker/docker/api/types/filters" "github.com/docker/docker/volume" ) // By is an interface which is used to implement filtering on volumes. type By interface { isBy() } // ByDriver is `By` that filters based on the driver names that are passed in func ByDriver(drivers ...string) By { return byDriver(drivers) } type byDriver []string func (byDriver) isBy() {} // ByReferenced is a `By` that filters based on if the volume has references type ByReferenced bool func (ByReferenced) isBy() {} // And creates a `By` combining all the passed in bys using AND logic. func And(bys ...By) By { and := make(andCombinator, 0, len(bys)) for _, by := range bys { and = append(and, by) } return and } type andCombinator []By func (andCombinator) isBy() {} // Or creates a `By` combining all the passed in bys using OR logic. func Or(bys ...By) By { or := make(orCombinator, 0, len(bys)) for _, by := range bys { or = append(or, by) } return or } type orCombinator []By func (orCombinator) isBy() {} // CustomFilter is a `By` that is used by callers to provide custom filtering // logic. type CustomFilter filterFunc func (CustomFilter) isBy() {} // FromList returns a By which sets the initial list of volumes to use func FromList(ls *[]volume.Volume, by By) By { return &fromList{by: by, ls: ls} } type fromList struct { by By ls *[]volume.Volume } func (fromList) isBy() {} func byLabelFilter(filter filters.Args) By { return CustomFilter(func(v volume.Volume) bool { dv, ok := v.(volume.DetailedVolume) if !ok { return false } labels := dv.Labels() if !filter.MatchKVList("label", labels) { return false } if filter.Contains("label!") { if filter.MatchKVList("label!", labels) { return false } } return true }) }