From 7496e53afa7e63e0d50b0ca9769ec77729342f7a Mon Sep 17 00:00:00 2001
From: Kevin Lyda <kevin@lyda.ie>
Date: Sun, 27 Nov 2022 20:56:25 +0000
Subject: [PATCH] Initial pass as parsing config.

---
 config/main.go         | 118 +++++++++++++++++++++++++++++++++++++++++
 doc/config.sample.yaml |  12 +++++
 2 files changed, 130 insertions(+)
 create mode 100644 config/main.go
 create mode 100644 doc/config.sample.yaml

diff --git a/config/main.go b/config/main.go
new file mode 100644
index 0000000..bd3050e
--- /dev/null
+++ b/config/main.go
@@ -0,0 +1,118 @@
+package main
+
+import (
+	"fmt"
+	"os"
+
+	"gopkg.in/yaml.v3"
+)
+
+type ParamsInterface interface {
+	Name() string
+	OnClick() string
+}
+
+type Module struct {
+	Module  string          `yaml:"module"`
+	Name    string          `yaml:"name"`
+	OnClick string          `yaml:"on-click"`
+	Params  ParamsInterface `yaml:"-"`
+}
+
+type M Module
+
+type Params struct {
+	*M     `yaml:",inline"`
+	Params yaml.Node `yaml:"params"`
+}
+
+type DateMod struct {
+	name    string
+	onclick string
+	Format  string `yaml:"format"`
+}
+
+type TextMod struct {
+	name    string
+	onclick string
+	//Name    string `yaml:"-"`
+	//OnClick string `yaml:"-"`
+	Text  string `yaml:"text"`
+	Color string `yaml:"color"`
+}
+
+func NewDate(m *Module) *DateMod {
+	d := &DateMod{
+		name:    m.Name,
+		onclick: m.OnClick,
+	}
+	if d.name == "" {
+		d.name = "date"
+	}
+	return d
+}
+
+func (d *DateMod) Name() string {
+	return d.name
+}
+
+func (d *DateMod) OnClick() string {
+	return d.onclick
+}
+
+func NewText(m *Module) *TextMod {
+	t := &TextMod{
+		name:    m.Name,
+		onclick: m.OnClick,
+	}
+	if t.name == "" {
+		t.name = "text"
+	}
+	return t
+}
+
+func (t *TextMod) Name() string {
+	return t.name
+}
+
+func (t *TextMod) OnClick() string {
+	return t.onclick
+}
+
+type Modules struct {
+	Modules []Module `yaml:"modules"`
+}
+
+func (m *Module) UnmarshalYAML(node *yaml.Node) error {
+	params := &Params{M: (*M)(m)}
+	if err := node.Decode(params); err != nil {
+		return err
+	}
+
+	switch params.Module {
+	case "date":
+		m.Params = NewDate(m)
+	case "text":
+		m.Params = NewText(m)
+	default:
+		panic("module unknown")
+	}
+	return params.Params.Decode(m.Params)
+}
+
+func main() {
+	config, err := os.Open(os.Args[1])
+	if err != nil {
+		panic(err)
+	}
+	defer config.Close()
+	configParser := yaml.NewDecoder(config)
+	cfg := &Modules{}
+	err = configParser.Decode(&cfg)
+	if err != nil {
+		panic(err)
+	}
+	for _, m := range cfg.Modules {
+		fmt.Printf("%s:%s:%s\n", m.Module, m.Name, m.Params.Name())
+	}
+}
diff --git a/doc/config.sample.yaml b/doc/config.sample.yaml
new file mode 100644
index 0000000..b03bd3b
--- /dev/null
+++ b/doc/config.sample.yaml
@@ -0,0 +1,12 @@
+---
+modules:
+  - module: text
+    name: post
+    params:
+      text: "post"
+      color: "#11ff11"
+    on-click: xdg-open https://mastodon.ie/
+  - module: date
+    params:
+      format: 06-05-04 15:02
+    on-click: xdg-open https://calendar.google.com/
-- 
GitLab