in internal/ui/stack.go [270:349]
func GetStackSummary(stack types.Stack, long bool) string {
out := strings.Builder{}
stackStatus := string(stack.StackStatus)
stackName := ptr.ToString(stack.StackName)
// Stack status
out.WriteString(fmt.Sprintf("%s: %s\n", console.Yellow(fmt.Sprintf("Stack %s", stackName)), ColouriseStatus(stackStatus)))
if long {
// Params
if len(stack.Parameters) > 0 {
out.WriteString(fmt.Sprintf(" %s:\n", console.Yellow("Parameters")))
for _, param := range stack.Parameters {
out.WriteString(fmt.Sprintf(" %s: ", console.Yellow(ptr.ToString(param.ParameterKey))))
if param.ResolvedValue != nil {
out.WriteString(ptr.ToString(param.ResolvedValue))
} else {
out.WriteString(ptr.ToString(param.ParameterValue))
}
out.WriteString("\n")
}
}
// Resources
out.WriteString(fmt.Sprintf(" %s:\n", console.Yellow("Resources")))
resources, _ := cfn.GetStackResources(stackName) // Ignore errors - it just means we'll get no resources
for _, resource := range resources {
out.WriteString(fmt.Sprintf(" %s: %s\n",
console.Yellow(ptr.ToString(resource.LogicalResourceId)),
ColouriseStatus(string(resource.ResourceStatus)),
))
if ptr.ToString(resource.ResourceType) == "AWS::CloudFormation::Stack" {
nestedStack, err := cfn.GetStack(ptr.ToString(resource.PhysicalResourceId))
if err == nil {
nestedSummary := GetStackSummary(nestedStack, long)
for _, line := range strings.Split(nestedSummary, "\n") {
out.WriteString(fmt.Sprintf(" %s\n", line))
}
}
} else {
out.WriteString(fmt.Sprintf(" %s\n", ptr.ToString(resource.PhysicalResourceId)))
}
}
}
// Outputs
if len(stack.Outputs) > 0 {
out.WriteString(fmt.Sprintf("%s:\n", console.Yellow(" Outputs")))
for _, output := range stack.Outputs {
out.WriteString(fmt.Sprintf(" %s: %s", console.Yellow(ptr.ToString(output.OutputKey)), ptr.ToString(output.OutputValue)))
if output.Description != nil || output.ExportName != nil {
out.WriteString(console.Grey(" # "))
if output.Description != nil {
out.WriteString(console.Grey(ptr.ToString(output.Description)))
}
if output.ExportName != nil {
msg := fmt.Sprintf("exported as %s", ptr.ToString(output.ExportName))
if output.Description != nil {
msg = " (" + msg + ")"
}
out.WriteString(console.Grey(msg))
}
}
out.WriteString("\n")
}
}
return strings.TrimSpace(out.String())
}