blob: 5a19c7755cd425532c9556b659b4b9b7354b9f0c [file] [log] [blame]
package main
import (
"fmt"
"repodiff/constants"
"repodiff/controllers"
ent "repodiff/entities"
"repodiff/handlers"
"repodiff/persistence/filesystem"
)
const configFile = "config.json"
type controllerFunc func(ent.ApplicationConfig) error
func main() {
appConfig, err := loadConfig()
if err != nil {
panic(formattedError(err))
}
statusChannel := make(chan ent.StatusMessage)
go handlers.StartHTTP(appConfig.Port, statusChannel)
go run(appConfig, statusChannel)
select {}
}
func run(appConfig ent.ApplicationConfig, statusChannel chan ent.StatusMessage) {
statusChannel <- ent.StatusMessage{
JobStatus: constants.JobStatusRunning,
}
for _, controllerFn := range getEnabledControllers() {
if err := controllerFn(appConfig); err != nil {
topLevelErrorHandle(err, statusChannel)
return
}
}
statusChannel <- ent.StatusMessage{
JobStatus: constants.JobStatusComplete,
}
}
func getEnabledControllers() []controllerFunc {
enabled := getEnabledOperations()
return []controllerFunc{
disabledFnNullified(controllers.ExecuteDifferentials, enabled.Diff),
disabledFnNullified(controllers.DenormalizeData, enabled.Denorm),
disabledFnNullified(controllers.GenerateCommitReport, enabled.Report),
}
}
func disabledFnNullified(original controllerFunc, enabled bool) controllerFunc {
if enabled {
return original
}
return func(ent.ApplicationConfig) error {
return nil
}
}
func topLevelErrorHandle(err error, statusChannel chan ent.StatusMessage) {
statusChannel <- ent.StatusMessage{
JobStatus: constants.JobStatusFailed,
Meta: formattedError(err),
}
fmt.Println(formattedError(err))
}
func loadConfig() (ent.ApplicationConfig, error) {
var appConfig ent.ApplicationConfig
err := filesystem.ReadFileAsJson(configFile, &appConfig)
if err != nil {
return appConfig, err
}
return appConfig, nil
}
func formattedError(err error) string {
return fmt.Sprintf("%+v", err)
}