// ReplacePlaceholders generated a config file using the base config file for appname by replacing the possible placeholders // that the config fiel might have given a group of labels. These labels are used to retrieve the placeholders stored values func ReplacePlaceholders(s storage.Storage) func(c *gin.Context) { return func(c *gin.Context) { name := c.Param("appname") labels := c.DefaultQuery("labels", "default") renderType := c.Param("format") list := make(map[string]*common.Placeholder) myViper, err := readTemplate(name) if err != nil { c.String(http.StatusNotFound, "") } else { properties := placeholders.GetPlaceHolders(myViper) for _, v := range properties.Placeholders { list[v.PlaceHolder] = v } lbls := strings.Split(labels, ",") // MERGE values of different labels, last overrides current value for _, label := range lbls { l := s.GetOptions(name, label) for k, v := range l { if list[k] != nil { list[k].PropertyValue = v } } } template := replaceTemplatePlaceHolders(myViper, list) b := []byte(template) var err error if renderType == "original" { } else { extension := getFileExtension(myViper) replacedViper := viper.New() replacedViper.SetConfigType(extension) replacedViper.ReadConfig(bytes.NewBuffer([]byte(template))) b, err = render(replacedViper, renderType) } if err == nil { c.Data(http.StatusOK, "text/plain", b) } if err != nil { c.String(http.StatusInternalServerError, "Could not render %s", err) // FALLBACK, instead of an error render only the placeholders //b, err = json.MarshalIndent(list, "", " ") //c.Data(http.StatusOK, "text/json", b) } } } }
// GetPlaceHolders return the placeholders that are present in the appname config file func GetPlaceHolders(c *gin.Context) { name := c.Param("appname") myViper, err := readTemplate(name) if err != nil { c.String(http.StatusNotFound, "Config file for %s not found\n", name) } else { properties := placeholders.GetPlaceHolders(myViper) c.IndentedJSON(http.StatusOK, properties) } }