Files
Alma/config/moduleConfiguration.go

102 lines
2.5 KiB
Go

package config
import (
"alma/helpers"
"cmp"
"encoding/json"
"io"
"os"
"slices"
)
type ModuleConfiguration struct {
Target string `json:"target"`
Links map[string]string `json:"links"`
Exclude []string `json:"exclude"`
ExcludeReadme bool `json:"excludeReadme"`
Install string `json:"install"`
Configure string `json:"configure"`
}
func LoadModuleConfiguration(moduleConfigPath string) *ModuleConfiguration {
jsonFile, err := os.Open(moduleConfigPath)
if err != nil {
return nil
}
defer jsonFile.Close()
byteValue, _ := io.ReadAll(jsonFile)
var moduleConfigurationRoot map[string]*ModuleConfiguration
err = json.Unmarshal(byteValue, &moduleConfigurationRoot)
if err != nil {
return nil
}
platformKeys := make([]string, 0, len(moduleConfigurationRoot))
for key := range moduleConfigurationRoot {
if key != "default" && helpers.IsOnPlatform(key) {
platformKeys = append(platformKeys, key)
}
}
slices.SortFunc(platformKeys, func(i, j string) int {
return cmp.Compare(i, j)
})
var moduleConfiguration *ModuleConfiguration
if moduleConfigurationRoot["default"] != nil {
moduleConfiguration = moduleConfigurationRoot["default"]
}
for _, platformKey := range platformKeys {
moduleConfiguration.Merge(moduleConfigurationRoot[platformKey])
}
return moduleConfiguration
}
func (moduleConfig *ModuleConfiguration) Merge(mergeConfig *ModuleConfiguration) {
// Merge links
mergedLinks := make(map[string]string, len(moduleConfig.Links)+len(mergeConfig.Links))
for key, value := range moduleConfig.Links {
mergedLinks[key] = value
}
for key, value := range mergeConfig.Links {
mergedLinks[key] = value
}
moduleConfig.Links = mergedLinks
// Merge excludes
mergedExcludes := make([]string, len(moduleConfig.Exclude)+len(mergeConfig.Exclude))
excludeIndex := 0
for _, value := range moduleConfig.Exclude {
mergedExcludes[excludeIndex] = value
excludeIndex++
}
for _, value := range mergeConfig.Links {
mergedExcludes[excludeIndex] = value
excludeIndex++
}
moduleConfig.Exclude = mergedExcludes
// Simple properties
if mergeConfig.Target != "" {
moduleConfig.Target = mergeConfig.Target
}
if mergeConfig.Install != "" {
moduleConfig.Install = mergeConfig.Install
}
if mergeConfig.Configure != "" {
moduleConfig.Configure = mergeConfig.Configure
}
moduleConfig.ExcludeReadme = moduleConfig.ExcludeReadme || mergeConfig.ExcludeReadme
}