forked from forj-oss/goforjj
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathyaml-plugin.go
97 lines (89 loc) · 3.12 KB
/
yaml-plugin.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
87
88
89
90
91
92
93
94
95
96
97
package goforjj
const ObjectApp = "app"
// Data structure in /
// ---
// plugin: string - Driver name (Name)
// version: string - driver version
// description: string - driver description
// runtime: struct - See YamlPluginRuntime
// actions: hash of struct - See YamlPluginDef - must be common/create/update/maintain as hash keys only.
type YamlPlugin struct {
Name string `yaml:"plugin"`
Version string `yaml:",omitempty"`
Description string `yaml:",omitempty"`
CreatedFile string `yaml:"created_flag_file"`
ExtendRelPath string `yaml:"extend_relative_path,omitempty"`
Runtime YamlPluginRuntime
YamlPluginTasksObjects `yaml:",inline"`
instancesDetails map[string]*YamlPluginTasksObjects
}
func NewYamlPlugin() (ret *YamlPlugin) {
ret = new(YamlPlugin)
ret.instancesDetails = make(map[string]*YamlPluginTasksObjects)
return
}
// MergeWith creates a new Yamlplugin object built from a merged between this plugin and the extension.
// except instance Details, source data won't be modified as there is no object pointer
func (p *YamlPlugin) MergeWith(instance string, extended *YamlPluginTasksObjects) (merged *YamlPlugin) {
merged = new(YamlPlugin)
*merged = *p
p.instancesDetails[instance] = extended
merged.instancesDetails = nil
// Add extended task flags for inexistent in source.
for taskType, taskList := range extended.Tasks {
if srcList, found := p.Tasks[taskType]; found {
for taskName, task := range taskList {
if _, foundTask := srcList[taskName]; !foundTask {
if srcList == nil {
srcList = make(map[string]YamlFlag)
}
task.extentSource = true
srcList[taskName] = task
merged.Tasks[taskType] = srcList
}
}
}
}
// Add extended object flags for inexistent in source.
for objectType, object := range extended.Objects {
if srcObject, found := p.Objects[objectType]; found {
for flagName, flag := range object.Flags {
if _, foundFlag := srcObject.Flags[flagName]; !foundFlag {
if srcObject.Flags == nil {
srcObject.Flags = make(map[string]YamlFlag)
}
flag.extentSource = true
srcObject.Flags[flagName] = flag
merged.Objects[objectType] = srcObject
}
}
// Add extended object group of flags for inexistent in source.
for groupName, group := range object.Groups {
if srcGroup, foundGroup := srcObject.Groups[groupName]; !foundGroup {
if srcObject.Groups == nil {
srcObject.Groups = make(map[string]YamlObjectGroup)
}
for flag_name, flag := range group.Flags {
flag.extentSource = true
group.Flags[flag_name] = flag
}
srcObject.Groups[groupName] = group
merged.Objects[objectType] = srcObject
} else {
for flagName, flag := range group.Flags {
if _, foundFlag := srcGroup.Flags[flagName]; !foundFlag {
if srcObject.Flags == nil {
srcObject.Flags = make(map[string]YamlFlag)
}
flag.extentSource = true
srcGroup.Flags[flagName] = flag
srcObject.Groups[groupName] = srcGroup
merged.Objects[objectType] = srcObject
}
}
}
}
}
}
return
}