apparmor.d/pkg/paths/list.go
2024-04-28 00:30:59 +01:00

214 lines
5.5 KiB
Go

/*
* This file is part of PathsHelper library.
*
* Copyright 2018 Arduino AG (http://www.arduino.cc/)
*
* PathsHelper library is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*
* As a special exception, you may use this file as part of a free software
* library without restriction. Specifically, if other files instantiate
* templates or use macros or inline functions from this file, or you compile
* this file and link it with other files to produce an executable, this
* file does not by itself cause the resulting executable to be covered by
* the GNU General Public License. This exception does not however
* invalidate any other reasons why the executable file might be covered by
* the GNU General Public License.
*/
package paths
import (
"sort"
)
// PathList is a list of Path
type PathList []*Path
// NewPathList creates a new PathList with the given paths
func NewPathList(paths ...string) PathList {
res := PathList{}
for _, path := range paths {
res = append(res, New(path))
}
return res
}
// Clone returns a copy of the current PathList
func (p *PathList) Clone() PathList {
res := PathList{}
for _, path := range *p {
res.Add(path.Clone())
}
return res
}
// AsStrings return this path list as a string array
func (p *PathList) AsStrings() []string {
res := []string{}
for _, path := range *p {
res = append(res, path.String())
}
return res
}
// FilterDirs remove all entries except directories
func (p *PathList) FilterDirs() {
res := (*p)[:0]
for _, path := range *p {
if path.IsDir() {
res = append(res, path)
}
}
*p = res
}
// FilterOutDirs remove all directories entries
func (p *PathList) FilterOutDirs() {
res := (*p)[:0]
for _, path := range *p {
if !path.IsDir() {
res = append(res, path)
}
}
*p = res
}
// FilterOutHiddenFiles remove all hidden files (files with the name
// starting with ".")
func (p *PathList) FilterOutHiddenFiles() {
p.FilterOutPrefix(".")
}
// Filter will remove all the elements of the list that do not match
// the specified acceptor function
func (p *PathList) Filter(acceptorFunc func(*Path) bool) {
res := (*p)[:0]
for _, path := range *p {
if acceptorFunc(path) {
res = append(res, path)
}
}
*p = res
}
// FilterOutPrefix remove all entries having one of the specified prefixes
func (p *PathList) FilterOutPrefix(prefixes ...string) {
filterFunction := func(path *Path) bool {
return !path.HasPrefix(prefixes...)
}
p.Filter(filterFunction)
}
// FilterPrefix remove all entries not having one of the specified prefixes
func (p *PathList) FilterPrefix(prefixes ...string) {
filterFunction := func(path *Path) bool {
return path.HasPrefix(prefixes...)
}
p.Filter(filterFunction)
}
// FilterOutSuffix remove all entries having one of the specified suffixes
func (p *PathList) FilterOutSuffix(suffixies ...string) {
filterFunction := func(path *Path) bool {
return !path.HasSuffix(suffixies...)
}
p.Filter(filterFunction)
}
// FilterSuffix remove all entries not having one of the specified suffixes
func (p *PathList) FilterSuffix(suffixies ...string) {
filterFunction := func(path *Path) bool {
return path.HasSuffix(suffixies...)
}
p.Filter(filterFunction)
}
// Add adds a Path to the PathList
func (p *PathList) Add(path *Path) {
*p = append(*p, path)
}
// AddAll adds all Paths in the list passed as argument
func (p *PathList) AddAll(paths PathList) {
*p = append(*p, paths...)
}
// AddIfMissing adds a Path to the PathList if the path is not already
// in the list
func (p *PathList) AddIfMissing(path *Path) {
if (*p).Contains(path) {
return
}
(*p).Add(path)
}
// AddAllMissing adds all paths to the PathList excluding the paths already
// in the list
func (p *PathList) AddAllMissing(pathsToAdd PathList) {
for _, pathToAdd := range pathsToAdd {
(*p).AddIfMissing(pathToAdd)
}
}
// ToAbs calls Path.ToAbs() method on each path of the list.
// It stops at the first error and returns it. If all ToAbs calls
// are successful nil is returned.
func (p *PathList) ToAbs() error {
for _, path := range *p {
if err := path.ToAbs(); err != nil {
return err
}
}
return nil
}
// Contains check if the list contains a path that match
// exactly (EqualsTo) to the specified path
func (p *PathList) Contains(pathToSearch *Path) bool {
for _, path := range *p {
if path.EqualsTo(pathToSearch) {
return true
}
}
return false
}
// ContainsEquivalentTo check if the list contains a path
// that is equivalent (EquivalentTo) to the specified path
func (p *PathList) ContainsEquivalentTo(pathToSearch *Path) bool {
for _, path := range *p {
if path.EquivalentTo(pathToSearch) {
return true
}
}
return false
}
// Sort sorts this pathlist
func (p *PathList) Sort() {
sort.Sort(p)
}
func (p *PathList) Len() int {
return len(*p)
}
func (p *PathList) Less(i, j int) bool {
return (*p)[i].path < (*p)[j].path
}
func (p *PathList) Swap(i, j int) {
(*p)[i], (*p)[j] = (*p)[j], (*p)[i]
}