cloudflare/pint

Public

mirrored from https://github.com/cloudflare/pintAvailable

CodeCommitsIssuesPull requestsActionsInsightsSecurity
v0.29.3

Branches

Tags

  • No tags available.
0Branches0Tags
Go to file
Add file
Code

Clone

HTTPS

Download ZIP

internal/parser/decode.go

41lines · modepreview

package parser

import (
	"errors"

	promparser "github.com/prometheus/prometheus/promql/parser"
)

func DecodeExpr(expr string) (*PromQLNode, error) {
	node, err := promparser.ParseExpr(expr)
	if err != nil {
		pqe := PromQLError{Err: err}
		pqe.node = &PromQLNode{
			Expr: expr,
			Node: node,
		}
		var perrs promparser.ParseErrors
		if ok := errors.As(err, &perrs); ok {
			for _, perr := range perrs {
				pqe.Err = perr.Err
				pqe.node.Expr = perr.Query
			}
		}
		return nil, pqe
	}

	pn := PromQLNode{
		Expr: expr,
		Node: node,
	}

	for _, child := range promparser.Children(node) {
		c, err := DecodeExpr(child.String())
		if err != nil {
			return nil, err
		}
		pn.Children = append(pn.Children, c)
	}

	return &pn, nil
}