-
Notifications
You must be signed in to change notification settings - Fork 1
/
tree.go
86 lines (69 loc) · 2.05 KB
/
tree.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
/*
http://www.apache.org/licenses/LICENSE-2.0.txt
Copyright 2015 Intel Corporation
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package cdata
import (
"bytes"
"encoding/gob"
"github.com/intelsdi-x/snap/pkg/ctree"
)
// Allows adding of config data by namespace and retrieving of data from tree
// at a specific namespace (merging the relevant hiearchy). Uses pkg.ConfigTree.
type ConfigDataTree struct {
cTree *ctree.ConfigTree
}
// Returns a new ConfigDataTree.
func NewTree() *ConfigDataTree {
return &ConfigDataTree{
cTree: ctree.New(),
}
}
func (c *ConfigDataTree) GobEncode() ([]byte, error) {
w := new(bytes.Buffer)
encoder := gob.NewEncoder(w)
if err := encoder.Encode(c.cTree); err != nil {
return nil, err
}
return w.Bytes(), nil
}
func (c *ConfigDataTree) GobDecode(buf []byte) error {
r := bytes.NewBuffer(buf)
decoder := gob.NewDecoder(r)
return decoder.Decode(&c.cTree)
}
// Adds a ConfigDataNode at the provided namespace.
func (c *ConfigDataTree) Add(ns []string, cdn *ConfigDataNode) {
c.cTree.Add(ns, cdn)
}
// Returns a ConfigDataNode that is a merged version of the namespace provided.
func (c *ConfigDataTree) Get(ns []string) *ConfigDataNode {
// Automatically freeze on first Get
if !c.cTree.Frozen() {
c.cTree.Freeze()
}
n := c.cTree.Get(ns)
if n == nil {
return nil
}
switch t := n.(type) {
case ConfigDataNode:
return &t
default:
return t.(*ConfigDataNode)
}
}
// Freezes the ConfigDataTree from future writes (adds) and triggers compression
// of tree into read-performant version.
func (c *ConfigDataTree) Freeze() {
c.cTree.Freeze()
}