本文整理匯總了Golang中deepstack.DeepStack類的典型用法代碼示例。如果您正苦於以下問題:Golang DeepStack類的具體用法?Golang DeepStack怎麽用?Golang DeepStack使用的例子?那麽, 這裏精選的類代碼示例或許可以為您提供幫助。
在下文中一共展示了DeepStack類的10個代碼示例,這些例子默認根據受歡迎程度排序。您可以為喜歡或者感覺有用的代碼點讚,您的評價將有助於係統推薦出更棒的Golang代碼示例。
示例1: TestFnGetAtt_Passthru_NonStringArguments
func TestFnGetAtt_Passthru_NonStringArguments(t *testing.T) {
stack := deepstack.DeepStack{}
stack.Push(fallbackmap.DeepMap(map[string]interface{}{
"FakeResource": map[string]interface{}{
"FakeProperty": "FakeValue",
},
}))
templateRules := template.Rules{}
inputs := []interface{}{
[]interface{}{"FakeResource", 1},
[]interface{}{1, "FakeProperty"},
}
for _, input := range inputs {
fnGetAtt := MakeFnGetAtt(&stack, &templateRules)
input := interface{}(map[string]interface{}{
"Fn::GetAtt": input,
})
newKey, newNode := fnGetAtt([]interface{}{"x", "y"}, input)
if newKey != "y" {
t.Fatalf("FnGetAtt modified the path (%v instead of %v)", newKey, "y")
}
if !reflect.DeepEqual(newNode, input) {
t.Fatalf("FnGetAtt with non-string arguments modified the data (%#v instead of %#v)", newNode, input)
}
}
}
示例2: TestFnGetAtt_Basic
func TestFnGetAtt_Basic(t *testing.T) {
stack := deepstack.DeepStack{}
stack.Push(fallbackmap.DeepMap(map[string]interface{}{
"FakeResource": map[string]interface{}{
"FakeProperty": map[string]interface{}{"FakeSub": "FakeValue"},
},
}))
templateRules := template.Rules{}
inputs := []interface{}{
[]interface{}{"FakeResource", "FakeProperty"},
[]interface{}{"FakeResource", "FakeProperty.FakeSub"},
}
expected := []interface{}{
map[string]interface{}{"FakeSub": "FakeValue"},
"FakeValue",
}
for i, input := range inputs {
fnGetAtt := MakeFnGetAtt(&stack, &templateRules)
input := interface{}(map[string]interface{}{
"Fn::GetAtt": input,
})
newKey, newNode := fnGetAtt([]interface{}{"x", "y"}, input)
if newKey != "y" {
t.Fatalf("FnGetAtt modified the path (%v instead of %v)", newKey, "y")
}
if !reflect.DeepEqual(newNode, expected[i]) {
t.Fatalf("FnGetAtt for %v did not return the expected result (%#v instead of %#v)", input, newNode, expected[i])
}
}
}
示例3: TestFnFor_PreProcessArgs
func TestFnFor_PreProcessArgs(t *testing.T) {
stack := deepstack.DeepStack{}
templateRules := template.Rules{}
templateRules.Attach(func(path []interface{}, node interface{}) (interface{}, interface{}) {
key := interface{}(nil)
if len(path) > 0 {
key = path[len(path)-1]
}
aString, ok := node.(string)
if !ok {
return key, node
}
if aString == "skip" {
return true, nil
}
if aString == "refNames" {
return key, []interface{}{"key", "value"}
}
if aString == "values" {
return key, []interface{}{"a"}
}
if aString == "template" {
_, hasKey := stack.Get([]string{"value"})
if hasKey {
return key, "processed-template"
}
return key, "preprocessed-template"
}
return key, node
})
fnFor := MakeFnFor(&stack, &templateRules)
input := interface{}(map[string]interface{}{
"Fn::For": []interface{}{"skip", "refNames", "skip", "values", "skip", "template", "skip"},
})
expected := []interface{}{"processed-template"}
newKey, newNode := fnFor([]interface{}{"x", "y"}, input)
if newKey != "y" {
t.Fatalf("FnFor modified the path (%v instead of %v)", newKey, "y")
}
if !reflect.DeepEqual(newNode, expected) {
t.Fatalf("FnFor with did not return the expected result (%#v instead of %#v)", newNode, expected)
}
}
示例4: MakeFnWith
func MakeFnWith(sources *deepstack.DeepStack, outerRules *template.Rules) template.Rule {
return func(path []interface{}, node interface{}) (interface{}, interface{}) {
key := interface{}(nil)
if len(path) > 0 {
key = path[len(path)-1]
}
raw, ok := singleKey(node, "Fn::With")
if !ok {
return key, node //passthru
}
args, ok := collectArgs(
raw,
func(argsSoFar []interface{}) bool {
return len(argsSoFar) < 2
},
func(argsSoFar []interface{}, arg interface{}) (bool, interface{}) {
// unconditionally process the argument, in case it needs to be skipped
key, node := template.Walk(path, arg, outerRules)
if skip, ok := key.(bool); ok && skip {
return true, nil
}
if len(argsSoFar) == 1 {
return false, arg // return unprocessed 2nd arg. It's a template.
}
return false, node
},
)
if !ok {
return key, node //passthru
}
var source map[string]interface{}
if source, ok = args[0].(map[string]interface{}); !ok {
return key, node //passthru
}
sources.Push(fallbackmap.DeepMap(source))
innerTemplate := interface{}(args[1])
key, generated := template.Walk(path, innerTemplate, outerRules)
sources.PopDiscard()
return key, interface{}(generated)
}
}
示例5: TestFnGetAtt_ProcessBound
func TestFnGetAtt_ProcessBound(t *testing.T) {
stack := deepstack.DeepStack{}
stack.Push(fallbackmap.DeepMap(map[string]interface{}{
"FakeResource": map[string]interface{}{
"FakeProperty": map[string]interface{}{"FakeSub": "FakeValue"},
},
}))
templateRules := template.Rules{}
templateRules.Attach(func(path []interface{}, node interface{}) (interface{}, interface{}) {
key := interface{}(nil)
if len(path) > 0 {
key = path[len(path)-1]
}
if stringVal, ok := node.(string); ok && stringVal == "FakeValue" {
return key, interface{}("ProcessedFakeValue")
}
return key, node
})
inputs := []interface{}{
[]interface{}{"FakeResource", "FakeProperty.FakeSub"},
}
expected := []interface{}{
"ProcessedFakeValue",
}
for i, input := range inputs {
fnGetAtt := MakeFnGetAtt(&stack, &templateRules)
input := interface{}(map[string]interface{}{
"Fn::GetAtt": input,
})
newKey, newNode := fnGetAtt([]interface{}{"x", "y"}, input)
if newKey != "y" {
t.Fatalf("FnGetAtt modified the path (%v instead of %v)", newKey, "y")
}
if !reflect.DeepEqual(newNode, expected[i]) {
t.Fatalf("FnGetAtt for %v did not return the expected result (%#v instead of %#v)", input, newNode, expected[i])
}
}
}
示例6: TestRef_Basic
func TestRef_Basic(t *testing.T) {
stack := deepstack.DeepStack{}
stack.Push(fallbackmap.DeepMap(map[string]interface{}{
"BoundVar": "BoundValue",
}))
templateRules := template.Rules{}
expected := "BoundValue"
ref := MakeRef(&stack, &templateRules)
input := interface{}(map[string]interface{}{
"Ref": "BoundVar",
})
newKey, newNode := ref([]interface{}{"x", "y"}, input)
if newKey != "y" {
t.Fatalf("Ref modified the path (%v instead of %v)", newKey, "y")
}
if !reflect.DeepEqual(newNode, expected) {
t.Fatalf("Ref for %v did not return the expected result (%#v instead of %#v)", input, newNode, expected)
}
}
示例7: TestFnFor_StackWithArray
func TestFnFor_StackWithArray(t *testing.T) {
stack := deepstack.DeepStack{}
stack.Push(fallbackmap.DeepMap(map[string]interface{}{"outer": "outerValue", "masked": "outerMasked"}))
testRefNames := []interface{}{
[]interface{}{"key", "masked"},
[]interface{}{nil, "masked"},
[]interface{}{"key", nil},
[]interface{}{nil, nil},
[]interface{}{"masked"},
"masked",
}
expected := []interface{}{
[]interface{}{
map[string]interface{}{
"outer": []interface{}{"outerValue", true},
"masked": []interface{}{"innerMasking", true},
"key": []interface{}{float64(0), true},
},
},
[]interface{}{
map[string]interface{}{
"outer": []interface{}{"outerValue", true},
"masked": []interface{}{"innerMasking", true},
},
},
[]interface{}{
map[string]interface{}{
"outer": []interface{}{"outerValue", true},
"masked": []interface{}{"outerMasked", true},
"key": []interface{}{float64(0), true},
},
},
[]interface{}{
map[string]interface{}{
"outer": []interface{}{"outerValue", true},
"masked": []interface{}{"outerMasked", true},
},
},
[]interface{}{
map[string]interface{}{
"outer": []interface{}{"outerValue", true},
"masked": []interface{}{"innerMasking", true},
},
},
[]interface{}{
map[string]interface{}{
"outer": []interface{}{"outerValue", true},
"masked": []interface{}{"innerMasking", true},
},
},
}
for i, refNames := range testRefNames {
input := interface{}(map[string]interface{}{
"Fn::For": []interface{}{
refNames,
[]interface{}{"innerMasking"},
"aTemplate",
},
})
templateRules := template.Rules{}
templateRules.Attach(func(path []interface{}, node interface{}) (interface{}, interface{}) {
key := interface{}(nil)
if len(path) > 0 {
key = path[len(path)-1]
}
if stringVal, ok := node.(string); !ok || stringVal != "aTemplate" {
return key, node
}
generated := map[string]interface{}{}
for binding, _ := range expected[i].([]interface{})[0].(map[string]interface{}) {
value, has_key := stack.Get([]string{binding})
generated[binding] = []interface{}{value, has_key}
}
return key, generated
})
fnFor := MakeFnFor(&stack, &templateRules)
newKey, newNode := fnFor([]interface{}{"x", "y"}, input)
if newKey != "y" {
t.Fatalf("FnFor modified the path (%v instead of %v)", newKey, "y")
}
if !reflect.DeepEqual(newNode, expected[i]) {
t.Fatalf("FnFor did not have the correct stack values with refNames %v during templateRule (%#v instead of %#v)",
refNames,
newNode,
expected[i],
)
}
}
}
示例8: MakeFnFor
func MakeFnFor(sources *deepstack.DeepStack, templateRules *template.Rules) template.Rule {
return func(path []interface{}, node interface{}) (interface{}, interface{}) {
key := interface{}(nil)
if len(path) > 0 {
key = path[len(path)-1]
}
raw, ok := singleKey(node, "Fn::For")
if !ok {
return key, node //passthru
}
args, ok := collectArgs(
raw,
func(argsSoFar []interface{}) bool { return len(argsSoFar) < 3 },
func(argsSoFar []interface{}, arg interface{}) (skip bool, newNode interface{}) {
// unconditionally process the argument, in case it needs to be skipped
key, node := template.Walk(path, arg, templateRules)
if skip, ok := key.(bool); ok && skip {
return true, nil
}
if len(argsSoFar) == 2 {
return false, arg // return unprocessed 3rd arg. It's a template.
}
return false, node
},
)
if !ok {
return key, node //passthru
}
var refNames []interface{}
var refName interface{}
if refNames, ok = args[0].([]interface{}); ok {
if len(refNames) == 1 {
refNames = []interface{}{nil, refNames[0]}
} else if len(refNames) != 2 {
return key, node //passthru
}
} else {
refNames = []interface{}{nil, args[0]}
}
for _, refName = range refNames {
if _, ok = refName.(string); !ok && refName != nil {
return key, node //passthru
}
}
valuesInterface := args[1]
var values []interface{}
if values, ok = valuesInterface.([]interface{}); !ok {
return key, node //passthru
}
loopTemplate := interface{}(args[2])
generated := []interface{}{}
for deepIndex, value := range values {
refMap := make(map[string]interface{})
if refNames[0] != nil {
refMap[refNames[0].(string)] = float64(deepIndex)
}
if refNames[1] != nil {
refMap[refNames[1].(string)] = value
}
deepPath := make([]interface{}, len(path)+1)
copy(deepPath, path)
deepPath[cap(deepPath)-1] = interface{}(deepIndex)
sources.Push(fallbackmap.DeepMap(refMap))
newIndex, processed := template.Walk(deepPath, loopTemplate, templateRules)
sources.PopDiscard()
if newIndex != nil {
generated = append(generated, processed)
}
}
return key, interface{}(generated)
}
}
示例9: TestFnWith_StackWithArray
func TestFnWith_StackWithArray(t *testing.T) {
stack := deepstack.DeepStack{}
stack.Push(fallbackmap.DeepMap(map[string]interface{}{"outer": "outer-value", "masked": "masked-value"}))
input := interface{}(map[string]interface{}{
"Fn::With": []interface{}{
map[string]interface{}{
"masked": "masking-value",
"inner": "inner-value",
},
map[string]interface{}{
"outer": "replace-with-outer",
"masked": "replace-with-masked",
"inner": "replace-with-inner",
"untouched": "stay-the-same",
},
},
})
expected := interface{}(map[string]interface{}{
"outer": "outer-value",
"masked": "masking-value",
"inner": "inner-value",
"untouched": "stay-the-same",
})
templateRules := template.Rules{}
templateRules.Attach(func(path []interface{}, node interface{}) (interface{}, interface{}) {
key := interface{}(nil)
if len(path) > 0 {
key = path[len(path)-1]
}
newNode := make(map[string]interface{})
if nodeMap, ok := node.(map[string]interface{}); ok {
if _, ok := node.(map[string]interface{})["untouched"]; ok {
for key, value := range nodeMap {
newValue, hasKey := stack.Get([]string{key})
if hasKey {
newNode[key] = newValue
} else {
newNode[key] = value
}
}
return key, newNode
}
}
return key, node
})
fnWith := MakeFnWith(&stack, &templateRules)
newKey, newNode := fnWith([]interface{}{"x", "y"}, input)
if newKey != "y" {
t.Fatalf("FnWith modified the path (%v instead of %v)", newKey, "y")
}
if !reflect.DeepEqual(newNode, expected) {
t.Fatalf("FnWith did not have the correct stack values during templateRule (%#v instead of %#v)",
newNode,
expected,
)
}
}
示例10: main
func main() {
templateRules := template.Rules{}
inputParameters := NewInputsFlag(&templateRules)
var templateFilename string
var outputWhat OutputWhatFlag
flag.StringVar(&templateFilename,
"template", "-",
"CloudFormation Template to process")
flag.Var(&inputParameters,
"parameters",
"File to use of input parameters (can be specified multiple times)")
flag.Var(&outputWhat,
"output",
"What to output after processing the Template")
flag.Parse()
var jsonStream io.Reader
var err error
if templateFilename == "-" {
jsonStream = os.Stdin
} else if jsonStream, err = os.Open(templateFilename); err != nil {
panic(err)
}
dec := json.NewDecoder(jsonStream)
t := make(map[string]interface{})
if err := dec.Decode(&t); err != nil {
panic(err)
}
sources := fallbackmap.FallbackMap{}
stack := deepstack.DeepStack{}
sources.Attach(inputParameters.Get())
sources.Attach(deepalias.DeepAlias{&stack})
sources.Attach(deepcloudformationoutputs.NewDeepCloudFormationOutputs("eu-west-1"))
sources.Attach(deepcloudformationresources.NewDeepCloudFormationResources("eu-west-1"))
stack.Push(&sources)
templateRules.AttachEarly(rules.ExcludeComments)
templateRules.AttachEarly(rules.MakeFnFor(&stack, &templateRules))
templateRules.AttachEarly(rules.MakeFnWith(&stack, &templateRules))
templateRules.Attach(rules.FnAdd)
templateRules.Attach(rules.FnIf)
templateRules.Attach(rules.FnAnd)
templateRules.Attach(rules.FnOr)
templateRules.Attach(rules.FnNot)
templateRules.Attach(rules.FnEquals)
templateRules.Attach(rules.FnConcat)
templateRules.Attach(rules.FnFromEntries)
templateRules.Attach(rules.FnHasKey)
templateRules.Attach(rules.FnJoin)
templateRules.Attach(rules.FnKeys)
templateRules.Attach(rules.FnLength)
templateRules.Attach(rules.FnMerge)
templateRules.Attach(rules.FnMergeDeep)
templateRules.Attach(rules.FnMod)
templateRules.Attach(rules.FnSplit)
templateRules.Attach(rules.FnToEntries)
templateRules.Attach(rules.FnUnique)
templateRules.Attach(rules.MakeFnGetAtt(&stack, &templateRules))
templateRules.Attach(rules.MakeRef(&stack, &templateRules))
templateRules.Attach(rules.MakeFnHasRef(&stack))
templateRules.Attach(rules.MakeFnIncludeFile(vfs.OS("/"), &templateRules))
templateRules.Attach(rules.MakeFnIncludeFileRaw(vfs.OS("/")))
templateRules.Attach(rules.ReduceConditions)
// First Pass (to collect Parameter names)
processed := template.Process(t, &templateRules)
parameterRefs := map[string]interface{}{}
if processedMap, ok := processed.(map[string]interface{}); ok {
if processedParameters, ok := processedMap["Parameters"]; ok {
if processedParametersMap, ok := processedParameters.(map[string]interface{}); ok {
for parameterName, _ := range processedParametersMap {
parameterRefs[parameterName] = map[string]interface{}{
"ParamRef": parameterName,
}
}
}
}
}
stack.Push(fallbackmap.DeepMap(parameterRefs))
templateRules.Attach(func(path []interface{}, node interface{}) (interface{}, interface{}) {
key := interface{}(nil)
if len(path) > 0 {
key = path[len(path)-1]
}
if nodeMap, ok := node.(map[string]interface{}); !ok || len(nodeMap) != 1 {
return key, node //passthru
}
//.........這裏部分代碼省略.........