...

Source file src/github.com/jackc/pgtype/multirange.go

Documentation: github.com/jackc/pgtype

     1  package pgtype
     2  
     3  import (
     4  	"bytes"
     5  	"fmt"
     6  )
     7  
     8  type UntypedTextMultirange struct {
     9  	Elements []string
    10  }
    11  
    12  func ParseUntypedTextMultirange(src string) (*UntypedTextMultirange, error) {
    13  	utmr := &UntypedTextMultirange{}
    14  	utmr.Elements = make([]string, 0)
    15  
    16  	buf := bytes.NewBufferString(src)
    17  
    18  	skipWhitespace(buf)
    19  
    20  	r, _, err := buf.ReadRune()
    21  	if err != nil {
    22  		return nil, fmt.Errorf("invalid array: %v", err)
    23  	}
    24  
    25  	if r != '{' {
    26  		return nil, fmt.Errorf("invalid multirange, expected '{': %v", err)
    27  	}
    28  
    29  parseValueLoop:
    30  	for {
    31  		r, _, err = buf.ReadRune()
    32  		if err != nil {
    33  			return nil, fmt.Errorf("invalid multirange: %v", err)
    34  		}
    35  
    36  		switch r {
    37  		case ',': // skip range separator
    38  		case '}':
    39  			break parseValueLoop
    40  		default:
    41  			buf.UnreadRune()
    42  			value, err := parseRange(buf)
    43  			if err != nil {
    44  				return nil, fmt.Errorf("invalid multirange value: %v", err)
    45  			}
    46  			utmr.Elements = append(utmr.Elements, value)
    47  		}
    48  	}
    49  
    50  	skipWhitespace(buf)
    51  
    52  	if buf.Len() > 0 {
    53  		return nil, fmt.Errorf("unexpected trailing data: %v", buf.String())
    54  	}
    55  
    56  	return utmr, nil
    57  
    58  }
    59  
    60  func parseRange(buf *bytes.Buffer) (string, error) {
    61  
    62  	s := &bytes.Buffer{}
    63  
    64  	boundSepRead := false
    65  	for {
    66  		r, _, err := buf.ReadRune()
    67  		if err != nil {
    68  			return "", err
    69  		}
    70  
    71  		switch r {
    72  		case ',', '}':
    73  			if r == ',' && !boundSepRead {
    74  				boundSepRead = true
    75  				break
    76  			}
    77  			buf.UnreadRune()
    78  			return s.String(), nil
    79  		}
    80  
    81  		s.WriteRune(r)
    82  	}
    83  }
    84  

View as plain text