| 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 | |
| }) | |
| } |