mirror of
https://github.com/prometheus/prometheus.git
synced 2024-11-10 07:34:04 -08:00
86 lines
1.2 KiB
Go
86 lines
1.2 KiB
Go
//go:generate golex -o=lex.l.go lex.l
|
|
package textparse
|
|
|
|
import (
|
|
"errors"
|
|
"io"
|
|
"reflect"
|
|
"unsafe"
|
|
|
|
"k8s.io/client-go/pkg/labels"
|
|
)
|
|
|
|
type lexer struct {
|
|
b []byte
|
|
i int
|
|
vstart int
|
|
|
|
mstart, mend int
|
|
err error
|
|
val float64
|
|
}
|
|
|
|
const eof = 0
|
|
|
|
func (l *lexer) next() byte {
|
|
l.i++
|
|
if l.i >= len(l.b) {
|
|
l.err = io.EOF
|
|
return eof
|
|
}
|
|
c := l.b[l.i]
|
|
return c
|
|
}
|
|
|
|
func (l *lexer) Error(es string) {
|
|
l.err = errors.New(es)
|
|
}
|
|
|
|
type Parser struct {
|
|
l *lexer
|
|
err error
|
|
val float64
|
|
}
|
|
|
|
func New(b []byte) *Parser {
|
|
return &Parser{l: &lexer{b: b}}
|
|
}
|
|
|
|
func (p *Parser) Next() bool {
|
|
switch p.l.Lex() {
|
|
case 0, -1:
|
|
return false
|
|
case 1:
|
|
return true
|
|
}
|
|
panic("unexpected")
|
|
}
|
|
|
|
func (p *Parser) At() ([]byte, *int64, float64) {
|
|
return p.l.b[p.l.mstart:p.l.mend], nil, p.l.val
|
|
}
|
|
|
|
func (p *Parser) Err() error {
|
|
if p.err != nil {
|
|
return p.err
|
|
}
|
|
if p.l.err == io.EOF {
|
|
return nil
|
|
}
|
|
return p.l.err
|
|
}
|
|
|
|
func (p *Parser) Metric() labels.Labels {
|
|
return nil
|
|
}
|
|
|
|
func yoloString(b []byte) string {
|
|
sh := (*reflect.SliceHeader)(unsafe.Pointer(&b))
|
|
|
|
h := reflect.StringHeader{
|
|
Data: sh.Data,
|
|
Len: sh.Len,
|
|
}
|
|
return *((*string)(unsafe.Pointer(&h)))
|
|
}
|