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