| 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) |
| } |