From c96ca310a019a892a717373677ded36dc0b9e2b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20=27Necoro=27=20Neumann?= Date: Fri, 17 Apr 2020 20:57:01 +0200 Subject: Read and organize feeds --- main.go | 116 +++++++++++++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 100 insertions(+), 16 deletions(-) (limited to 'main.go') diff --git a/main.go b/main.go index 9f20203..b238ff0 100644 --- a/main.go +++ b/main.go @@ -5,50 +5,134 @@ import ( "fmt" "io/ioutil" "log" + "os" - "gopkg.in/yaml.v2" + "gopkg.in/yaml.v3" ) var cfg = flag.String("f", "config.yml", "configuration file") type ConfigMap map[string]interface{} -type Feed struct { +type configFeed struct { Name string Url string MinFreq int `yaml:"min-frequency"` ConfigMap `yaml:",inline"` } -type Group struct { +type configGroup struct { Group string - Feeds []GroupFeed + Feeds []configGroupFeed } -type GroupFeed struct { - Target string - Feed `yaml:",inline"` - Group `yaml:",inline"` +type configGroupFeed struct { + Target *string + configFeed `yaml:",inline"` + configGroup `yaml:",inline"` } -type Yaml struct { +func (grpFeed *configGroupFeed) isGroup() bool { + return grpFeed.configGroup.Group != "" +} + +func (grpFeed *configGroupFeed) isFeed() bool { + return grpFeed.configFeed.Name != "" +} + +func (grpFeed *configGroupFeed) target() string { + if grpFeed.Target != nil { + return *grpFeed.Target + } + if grpFeed.Name != "" { + return grpFeed.Name + } + + return grpFeed.Group +} + +type config struct { GlobalConfig ConfigMap `yaml:",inline"` - Feeds []GroupFeed + Feeds []configGroupFeed } -func main() { +type feed struct { + name string + target string + url string + minFreq int + config ConfigMap +} + +var feeds = make(map[string]*feed) + +func appTarget(target, app string) string { + if target == "" { + return app + } + + if app == "" { + return target + } + + return target + "/" + app +} + +func buildFeeds(cfg []configGroupFeed, target string) error { + for _, f := range cfg { + target := appTarget(target, f.target()) + switch { + case f.isFeed() && f.isGroup(): + return fmt.Errorf("Entry with Target %s is both a feed and a group", target) + case f.isFeed(): + name := f.Name + if _, ok := feeds[name]; !ok { + return fmt.Errorf("Duplicate feed name '%s'", name) + } + feeds[name] = &feed{ + name: name, + target: target, + url: f.Url, + minFreq: f.MinFreq, + config: f.ConfigMap, + } + case f.isGroup(): + if err := buildFeeds(f.Feeds, target); err != nil { + return err + } + } + } + + return nil +} + +func run() error { log.Print("Starting up...") flag.Parse() log.Printf("Reading configuration file '%s'", *cfg) buf, err := ioutil.ReadFile(*cfg) if err != nil { - msg := fmt.Sprint("No file found: ", *cfg) - panic(msg) + return fmt.Errorf("while reading '%s': %w", *cfg, err) } - var m Yaml - yaml.Unmarshal(buf, &m) - fmt.Printf("--- m:\n%+v\n\n", m) + var parsedCfg config + if err := yaml.Unmarshal(buf, &parsedCfg); err != nil { + return fmt.Errorf("while unmarshalling: %w", err) + } + fmt.Printf("--- parsedCfg:\n%+v\n\n", parsedCfg) + + if err := buildFeeds(parsedCfg.Feeds, ""); err != nil { + return fmt.Errorf("while parsing: %w", err) + } + return nil +} + +func main() { + if err := run(); err != nil { + log.SetOutput(os.Stderr) + log.Print("Error: ", err) + os.Exit(1) + } } -- cgit v1.2.3