func mangleEvent(ctx context.Context, store *storage.Storage, txn storage.Transaction, event *topdown.Event) error { // Replace bindings with ref values with the values from storage. cpy := event.Locals.Copy() var err error event.Locals.Iter(func(k, v ast.Value) bool { if r, ok := v.(ast.Ref); ok { var path storage.Path path, err = storage.NewPathForRef(r) if err != nil { return true } var doc interface{} doc, err = store.Read(ctx, txn, path) if err != nil { return true } v, err = ast.InterfaceToValue(doc) if err != nil { return true } cpy.Put(k, v) } return false }) event.Locals = cpy switch node := event.Node.(type) { case *ast.Rule: event.Node = topdown.PlugHead(node.Head(), event.Locals.Get) case *ast.Expr: event.Node = topdown.PlugExpr(node, event.Locals.Get) } return nil }
func dumpStorage(ctx context.Context, store *storage.Storage, txn storage.Transaction, w io.Writer) error { data, err := store.Read(ctx, txn, storage.Path{}) if err != nil { return err } e := json.NewEncoder(w) return e.Encode(data) }