diff options
Diffstat (limited to 'rrdformat/rpn.go')
-rw-r--r-- | rrdformat/rpn.go | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/rrdformat/rpn.go b/rrdformat/rpn.go index 386c4ca..883a730 100644 --- a/rrdformat/rpn.go +++ b/rrdformat/rpn.go @@ -2,6 +2,13 @@ package rrdformat +import ( + "fmt" + "strings" + + "git.lukeshu.com/go/librrd/rrdformat/rrdbinary" +) + type Op uint8 const ( @@ -93,3 +100,28 @@ const ( OP_PERCENT OP_POW ) + +func (rrd RRD) RPNCompactToString(rpnps []rrdbinary.RPNToken) (string, error) { + strs := make([]string, len(rpnps)) + for _, rpnp := range rpnps { + switch Op(rpnp.Op) { + case OP_NUMBER: + strs = append(strs, fmt.Sprintf("%d", rpnp.Val)) + case OP_VARIABLE: + if rpnp.Val < 0 || int(rpnp.Val) >= len(rrd.DSDefs) { + return "", fmt.Errorf("out-of-bounds %s %d", Op(rpnp.Op), rpnp.Val) + } + strs = append(strs, string(rrd.DSDefs[int(rpnp.Val)].DSName)) + case OP_PREV_OTHER: + if rpnp.Val < 0 || int(rpnp.Val) >= len(rrd.DSDefs) { + return "", fmt.Errorf("out-of-bounds %s %d", Op(rpnp.Op), rpnp.Val) + } + strs = append(strs, fmt.Sprintf("PREV(%s)", rrd.DSDefs[int(rpnp.Val)].DSName)) + case OP_END: + break + default: + strs = append(strs, Op(rpnp.Op).String()) + } + } + return strings.Join(strs, ","), nil +} |