graphvent/context.go

73 lines
1.8 KiB
Go

2023-07-09 14:30:30 -06:00
package graphvent
import (
badger "github.com/dgraph-io/badger/v3"
"fmt"
)
2023-07-25 21:43:15 -06:00
type ExtensionLoadFunc func(*Context, []byte) (Extension, error)
type ExtensionInfo struct {
Load ExtensionLoadFunc
Type ExtType
Data interface{}
2023-07-09 14:30:30 -06:00
}
2023-07-10 22:31:43 -06:00
// A Context is all the data needed to run a graphvent
2023-07-09 14:30:30 -06:00
type Context struct {
2023-07-10 22:31:43 -06:00
// DB is the database connection used to load and write nodes
2023-07-09 14:30:30 -06:00
DB * badger.DB
2023-07-10 22:31:43 -06:00
// Log is an interface used to record events happening
2023-07-09 14:30:30 -06:00
Log Logger
2023-07-25 21:43:15 -06:00
// A mapping between type hashes and their corresponding extension definitions
Extensions map[uint64]ExtensionInfo
// All loaded Nodes
Nodes map[NodeID]*Node
2023-07-10 21:15:01 -06:00
}
2023-07-25 21:43:15 -06:00
func (ctx *Context) ExtByType(ext_type ExtType) ExtensionInfo {
type_hash := ext_type.Hash()
ext, _ := ctx.Extensions[type_hash]
return ext
2023-07-10 21:15:01 -06:00
}
2023-07-10 22:31:43 -06:00
// Add a node to a context, returns an error if the def is invalid or already exists in the context
2023-07-25 21:43:15 -06:00
func (ctx *Context) RegisterExtension(ext_type ExtType, load_fn ExtensionLoadFunc) error {
if load_fn == nil {
return fmt.Errorf("def has no load function")
2023-07-09 14:30:30 -06:00
}
2023-07-25 21:43:15 -06:00
type_hash := ext_type.Hash()
_, exists := ctx.Extensions[type_hash]
2023-07-09 14:30:30 -06:00
if exists == true {
2023-07-25 21:43:15 -06:00
return fmt.Errorf("Cannot register extension of type %s, type already exists in context", ext_type)
2023-07-09 14:30:30 -06:00
}
2023-07-25 21:43:15 -06:00
ctx.Extensions[type_hash] = ExtensionInfo{
Load: load_fn,
Type: ext_type,
2023-07-10 21:15:01 -06:00
}
2023-07-09 14:30:30 -06:00
return nil
}
2023-07-10 22:31:43 -06:00
// Create a new Context with all the library content added
2023-07-25 21:43:15 -06:00
func NewContext(db * badger.DB, log Logger) (*Context, error) {
2023-07-09 14:30:30 -06:00
ctx := &Context{
DB: db,
Log: log,
2023-07-25 21:43:15 -06:00
Extensions: map[uint64]ExtensionInfo{},
Nodes: map[NodeID]*Node{},
2023-07-09 14:30:30 -06:00
}
2023-07-25 21:43:15 -06:00
err := ctx.RegisterExtension(ACLExtType, LoadACLExtension)
2023-07-25 09:51:55 -06:00
if err != nil {
2023-07-25 21:43:15 -06:00
return nil, err
2023-07-25 09:51:55 -06:00
}
2023-07-10 21:15:01 -06:00
2023-07-25 21:43:15 -06:00
err = ctx.RegisterExtension(ACLPolicyExtType, LoadACLPolicyExtension)
2023-07-10 21:15:01 -06:00
if err != nil {
2023-07-25 21:43:15 -06:00
return nil, err
2023-07-09 14:30:30 -06:00
}
2023-07-25 21:43:15 -06:00
return ctx, nil
2023-07-09 14:30:30 -06:00
}