...

Source file src/oss.terrastruct.com/d2/d2ir/pattern.go

Documentation: oss.terrastruct.com/d2/d2ir

     1  package d2ir
     2  
     3  import (
     4  	"strings"
     5  
     6  	"oss.terrastruct.com/d2/d2ast"
     7  	"oss.terrastruct.com/d2/d2graph"
     8  )
     9  
    10  func (m *Map) multiGlob(pattern []string) ([]*Field, bool) {
    11  	var fa []*Field
    12  	if d2ast.IsDoubleGlob(pattern) {
    13  		m._doubleGlob(&fa)
    14  		return fa, true
    15  	}
    16  	if d2ast.IsTripleGlob(pattern) {
    17  		m._tripleGlob(&fa)
    18  		return fa, true
    19  	}
    20  	return nil, false
    21  }
    22  
    23  func (m *Map) _doubleGlob(fa *[]*Field) {
    24  	for _, f := range m.Fields {
    25  		if _, ok := d2graph.ReservedKeywords[f.Name]; ok {
    26  			if f.Name == "layers" {
    27  				continue
    28  			}
    29  			if _, ok := d2graph.BoardKeywords[f.Name]; !ok {
    30  				continue
    31  			}
    32  			// We don't ever want to append layers, scenarios or steps directly.
    33  			if f.Map() != nil {
    34  				f.Map()._tripleGlob(fa)
    35  			}
    36  			continue
    37  		}
    38  		if NodeBoardKind(f) == "" {
    39  			*fa = append(*fa, f)
    40  		}
    41  		if f.Map() != nil {
    42  			f.Map()._doubleGlob(fa)
    43  		}
    44  	}
    45  }
    46  
    47  func (m *Map) _tripleGlob(fa *[]*Field) {
    48  	for _, f := range m.Fields {
    49  		if _, ok := d2graph.ReservedKeywords[f.Name]; ok {
    50  			if _, ok := d2graph.BoardKeywords[f.Name]; !ok {
    51  				continue
    52  			}
    53  			// We don't ever want to append layers, scenarios or steps directly.
    54  			if f.Map() != nil {
    55  				f.Map()._tripleGlob(fa)
    56  			}
    57  			continue
    58  		}
    59  		if NodeBoardKind(f) == "" {
    60  			*fa = append(*fa, f)
    61  		}
    62  		if f.Map() != nil {
    63  			f.Map()._tripleGlob(fa)
    64  		}
    65  	}
    66  }
    67  
    68  func matchPattern(s string, pattern []string) bool {
    69  	if len(pattern) == 0 {
    70  		return true
    71  	}
    72  	if _, ok := d2graph.ReservedKeywords[s]; ok {
    73  		return false
    74  	}
    75  
    76  	for i := 0; i < len(pattern); i++ {
    77  		if pattern[i] == "*" {
    78  			// * so match next.
    79  			if i != len(pattern)-1 {
    80  				j := strings.Index(strings.ToLower(s), strings.ToLower(pattern[i+1]))
    81  				if j == -1 {
    82  					return false
    83  				}
    84  				s = s[j+len(pattern[i+1]):]
    85  				i++
    86  			}
    87  		} else {
    88  			if !strings.HasPrefix(strings.ToLower(s), strings.ToLower(pattern[i])) {
    89  				return false
    90  			}
    91  			s = s[len(pattern[i]):]
    92  		}
    93  	}
    94  	return true
    95  }
    96  

View as plain text