github.com/sagernet/sing-box@v1.9.0-rc.20/route/rule_item_package_name.go (about)

     1  package route
     2  
     3  import (
     4  	"strings"
     5  
     6  	"github.com/sagernet/sing-box/adapter"
     7  )
     8  
     9  var _ RuleItem = (*PackageNameItem)(nil)
    10  
    11  type PackageNameItem struct {
    12  	packageNames []string
    13  	packageMap   map[string]bool
    14  }
    15  
    16  func NewPackageNameItem(packageNameList []string) *PackageNameItem {
    17  	rule := &PackageNameItem{
    18  		packageNames: packageNameList,
    19  		packageMap:   make(map[string]bool),
    20  	}
    21  	for _, packageName := range packageNameList {
    22  		rule.packageMap[packageName] = true
    23  	}
    24  	return rule
    25  }
    26  
    27  func (r *PackageNameItem) Match(metadata *adapter.InboundContext) bool {
    28  	if metadata.ProcessInfo == nil || metadata.ProcessInfo.PackageName == "" {
    29  		return false
    30  	}
    31  	return r.packageMap[metadata.ProcessInfo.PackageName]
    32  }
    33  
    34  func (r *PackageNameItem) String() string {
    35  	var description string
    36  	pLen := len(r.packageNames)
    37  	if pLen == 1 {
    38  		description = "package_name=" + r.packageNames[0]
    39  	} else {
    40  		description = "package_name=[" + strings.Join(r.packageNames, " ") + "]"
    41  	}
    42  	return description
    43  }