summaryrefslogtreecommitdiff
path: root/rrdformat/rpn.go
diff options
context:
space:
mode:
Diffstat (limited to 'rrdformat/rpn.go')
-rw-r--r--rrdformat/rpn.go32
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
+}