feat context: Add support for resource set collections
A resource set collection is a resource set with an addition 'include' array configured. It is a short-hand for importing multiple resource sets from the same folder and for excluding/including them as a group. See https://github.com/tazjin/kontemplate/issues/9 for more information. Closes #9
This commit is contained in:
		
							parent
							
								
									d6b16793c1
								
							
						
					
					
						commit
						4e8223ef34
					
				
					 2 changed files with 29 additions and 5 deletions
				
			
		| 
						 | 
					@ -14,6 +14,10 @@ import (
 | 
				
			||||||
type ResourceSet struct {
 | 
					type ResourceSet struct {
 | 
				
			||||||
	Name   string                 `json:"name"`
 | 
						Name   string                 `json:"name"`
 | 
				
			||||||
	Values map[string]interface{} `json:"values"`
 | 
						Values map[string]interface{} `json:"values"`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Fields for resource set collections
 | 
				
			||||||
 | 
						Include []ResourceSet `json:"include"`
 | 
				
			||||||
 | 
						Parent  *string
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type Context struct {
 | 
					type Context struct {
 | 
				
			||||||
| 
						 | 
					@ -63,3 +67,23 @@ func LoadContextFromFile(filename string) (*Context, error) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return &c, nil
 | 
						return &c, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Flattens resource set collections, i.e. resource sets that themselves have an additional 'include' field set.
 | 
				
			||||||
 | 
					// Those will be regarded as a short-hand for including multiple resource sets from a subfolder.
 | 
				
			||||||
 | 
					// See https://github.com/tazjin/kontemplate/issues/9 for more information.
 | 
				
			||||||
 | 
					func flattenResourceSetCollections(rs *[]ResourceSet) *[]ResourceSet {
 | 
				
			||||||
 | 
						flattened := make([]ResourceSet, 0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for _, r := range *rs {
 | 
				
			||||||
 | 
							if len(r.Include) == 0 {
 | 
				
			||||||
 | 
								flattened = append(flattened, r)
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								for _, subResourceSet := range r.Include {
 | 
				
			||||||
 | 
									subResourceSet.Parent = &r.Name
 | 
				
			||||||
 | 
									flattened = append(flattened, subResourceSet)
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return &flattened
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -121,7 +121,7 @@ func applyLimits(rs *[]context.ResourceSet, include *[]string, exclude *[]string
 | 
				
			||||||
	// Exclude excluded resource sets
 | 
						// Exclude excluded resource sets
 | 
				
			||||||
	excluded := make([]context.ResourceSet, 0)
 | 
						excluded := make([]context.ResourceSet, 0)
 | 
				
			||||||
	for _, r := range *rs {
 | 
						for _, r := range *rs {
 | 
				
			||||||
		if !contains(exclude, &r.Name) {
 | 
							if !matchesResourceSet(exclude, &r) {
 | 
				
			||||||
			excluded = append(excluded, r)
 | 
								excluded = append(excluded, r)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -132,7 +132,7 @@ func applyLimits(rs *[]context.ResourceSet, include *[]string, exclude *[]string
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	included := make([]context.ResourceSet, 0)
 | 
						included := make([]context.ResourceSet, 0)
 | 
				
			||||||
	for _, r := range excluded {
 | 
						for _, r := range excluded {
 | 
				
			||||||
		if contains(include, &r.Name) {
 | 
							if matchesResourceSet(include, &r) {
 | 
				
			||||||
			included = append(included, r)
 | 
								included = append(included, r)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -140,10 +140,10 @@ func applyLimits(rs *[]context.ResourceSet, include *[]string, exclude *[]string
 | 
				
			||||||
	return &included
 | 
						return &included
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Check whether a certain string is contained in a string slice
 | 
					// Check whether an include/exclude string slice matches a resource set
 | 
				
			||||||
func contains(s *[]string, v *string) bool {
 | 
					func matchesResourceSet(s *[]string, rs *context.ResourceSet) bool {
 | 
				
			||||||
	for _, r := range *s {
 | 
						for _, r := range *s {
 | 
				
			||||||
		if r == *v {
 | 
							if r == rs.Name || r == *rs.Parent {
 | 
				
			||||||
			return true
 | 
								return true
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue