...

Source file src/go.einride.tech/aip/resourcename/sscan.go

Documentation: go.einride.tech/aip/resourcename

     1  package resourcename
     2  
     3  import (
     4  	"fmt"
     5  	"io"
     6  )
     7  
     8  // Sscan scans a resource name, storing successive segments into successive variables
     9  // as determined by the provided pattern.
    10  func Sscan(name, pattern string, variables ...*string) (err error) {
    11  	defer func() {
    12  		if err != nil {
    13  			err = fmt.Errorf("parse resource name '%s' with pattern '%s': %w", name, pattern, err)
    14  		}
    15  	}()
    16  	var nameScanner, patternScanner Scanner
    17  	nameScanner.Init(name)
    18  	patternScanner.Init(pattern)
    19  	var i int
    20  	for patternScanner.Scan() {
    21  		if patternScanner.Full() {
    22  			return fmt.Errorf("invalid pattern")
    23  		}
    24  		if !nameScanner.Scan() {
    25  			return fmt.Errorf("segment %s: %w", patternScanner.Segment(), io.ErrUnexpectedEOF)
    26  		}
    27  		nameSegment, patternSegment := nameScanner.Segment(), patternScanner.Segment()
    28  		if !patternSegment.IsVariable() {
    29  			if patternSegment.Literal() != nameSegment.Literal() {
    30  				return fmt.Errorf("segment %s: got %s", patternSegment, nameSegment)
    31  			}
    32  			continue
    33  		}
    34  		if i > len(variables)-1 {
    35  			return fmt.Errorf("segment %s: too few variables", patternSegment)
    36  		}
    37  		*variables[i] = string(nameSegment.Literal())
    38  		i++
    39  	}
    40  	if nameScanner.Scan() {
    41  		return fmt.Errorf("got trailing segments in name")
    42  	}
    43  	if i != len(variables) {
    44  		return fmt.Errorf("too many variables: got %d but expected %d", i, len(variables))
    45  	}
    46  	return nil
    47  }
    48  

View as plain text