Browse Source

Try out several config formats.

--unset 2 years ago
parent
commit
3a73efd5b6
5 changed files with 420 additions and 0 deletions
  1. 129 0
      config/config.go
  2. 64 0
      config/config_test.go
  3. 94 0
      config/testdata/config.hcl
  4. 78 0
      config/testdata/config.toml
  5. 55 0
      config/testdata/config.yaml

+ 129 - 0
config/config.go

@@ -0,0 +1,129 @@
+package config
+
+import "os"
+import "io"
+import "github.com/BurntSushi/toml"
+import "github.com/go-yaml/yaml"
+import "github.com/alecthomas/hcl"
+
+func LoadTomlFileName(name string) (*Config, error) {
+	conf := &Config{}
+	fin, err := os.Open(name)
+	if err != nil {
+		return nil, err
+	}
+	defer fin.Close()
+	dec := toml.NewDecoder(fin)
+	_, err = dec.Decode(conf)
+	return conf, err
+}
+
+func (c Config) SaveTomlFileName(name string) error {
+	fin, err := os.Create(name)
+	if err != nil {
+		return err
+	}
+	defer fin.Close()
+	dec := toml.NewEncoder(fin)
+	err = dec.Encode(c)
+	return err
+}
+
+func (c Config) SaveYamlFileName(name string) error {
+	fin, err := os.Create(name)
+	if err != nil {
+		return err
+	}
+	defer fin.Close()
+	dec := yaml.NewEncoder(fin)
+	defer dec.Close()
+	err = dec.Encode(c)
+	return err
+}
+
+func LoadYamlFileName(name string) (*Config, error) {
+	conf := &Config{}
+	fin, err := os.Open(name)
+	if err != nil {
+		return nil, err
+	}
+	defer fin.Close()
+	dec := yaml.NewDecoder(fin)
+	err = dec.Decode(conf)
+	return conf, err
+}
+
+func (c *Config) SaveHclFileName(name string) error {
+	fin, err := os.Create(name)
+	if err != nil {
+		return err
+	}
+	defer fin.Close()
+	buf, err := hcl.Marshal(c, hcl.InferHCLTags(true))
+	if err != nil {
+		return err
+	}
+	_, err = fin.Write(buf)
+	return err
+}
+
+func LoadHclFileName(name string) (*Config, error) {
+	conf := &Config{}
+	fin, err := os.Open(name)
+	if err != nil {
+		return nil, err
+	}
+	defer fin.Close()
+	buf, err := io.ReadAll(fin)
+	if err != nil {
+		return nil, err
+	}
+	err = hcl.Unmarshal(buf, conf, hcl.InferHCLTags(true))
+	return conf, err
+}
+
+type Net struct {
+	Id      *int
+	Listen  string
+	As      string
+	Command string
+}
+
+type Io struct {
+	Name string
+	Mime string
+}
+
+type Skill struct {
+	Name    string
+	Inputs  []Io
+	Outputs []Io
+}
+
+type Peer struct {
+	As     string
+	Skills []Skill
+}
+
+type Step struct {
+	Type string
+	Cmd  string
+}
+
+type Job struct {
+	Skill `toml:"skill"`
+	Step  []Step
+}
+
+type State struct {
+	Name  string
+	Kind  string
+	Order int
+}
+
+type Config struct {
+	Net    `toml:"net"`
+	Peers  []Peer  `toml:"peers"`
+	Jobs   []Job   `toml:"jobs"`
+	States []State `toml:"states"`
+}

+ 64 - 0
config/config_test.go

@@ -0,0 +1,64 @@
+package config
+
+import "testing"
+
+func TestSaveConfig(t *testing.T) {
+	conf := &Config{}
+	id := 12245
+	conf.Id = &id
+	conf.Net.Listen = "tcp:localhost:12345"
+	conf.Net.As = "tcp:10.0.0.1:12345"
+	conf.Net.Command = "unix:/tmp/bdjncl"
+	in := []Io{{"video", "application/mod"}}
+	out := []Io{{"result", "application/json"}}
+	sk := Skill{"test", in, out}
+	sk2 := Skill{"test2", in, out}
+
+	conf.Peers = []Peer{
+		Peer{As: "tcp:localhost:12346", Skills: []Skill{sk}},
+		Peer{As: "tcp:localhost:12347", Skills: []Skill{sk}},
+	}
+
+	st0 := Step{"s3-download", `"$input_video"`}
+	st1 := Step{"sh", `/bin/echo "$input_video" "$output_result"`}
+
+	conf.Jobs = []Job{
+		Job{sk, []Step{st0, st1}},
+		Job{sk2, []Step{st1, st0}},
+	}
+
+	conf.States = []State{
+		State{"test", "running", 1},
+	}
+	err := conf.SaveTomlFileName("testdata/config.toml")
+	if err != nil {
+		t.Errorf("Error saving: %s", err)
+	}
+
+	err = conf.SaveYamlFileName("testdata/config.yaml")
+	if err != nil {
+		t.Errorf("Error saving: %s", err)
+	}
+
+	dat, err := LoadYamlFileName("testdata/config.yaml")
+	if err != nil {
+		t.Errorf("Error loading: %s", err)
+	}
+
+	t.Logf("Encoded: %v", conf)
+	t.Logf("Loaded: %v", dat)
+
+	err = conf.SaveHclFileName("testdata/config.hcl")
+	if err != nil {
+		t.Errorf("Error saving: %s", err)
+	}
+
+	dat, err = LoadHclFileName("testdata/config.hcl")
+	if err != nil {
+		t.Errorf("Error loading: %s", err)
+	}
+
+	t.Logf("Encoded: %v", conf)
+	t.Logf("Loaded: %v", dat)
+
+}

+ 94 - 0
config/testdata/config.hcl

@@ -0,0 +1,94 @@
+Id = 12245
+Listen = "tcp:localhost:12345"
+As = "tcp:10.0.0.1:12345"
+Command = "unix:/tmp/bdjncl"
+
+Peers {
+  As = "tcp:localhost:12346"
+
+  Skills {
+    Name = "test"
+
+    Inputs {
+      Name = "video"
+      Mime = "application/mod"
+    }
+
+    Outputs {
+      Name = "result"
+      Mime = "application/json"
+    }
+  }
+}
+
+Peers {
+  As = "tcp:localhost:12347"
+
+  Skills {
+    Name = "test"
+
+    Inputs {
+      Name = "video"
+      Mime = "application/mod"
+    }
+
+    Outputs {
+      Name = "result"
+      Mime = "application/json"
+    }
+  }
+}
+
+Jobs {
+  Name = "test"
+
+  Inputs {
+    Name = "video"
+    Mime = "application/mod"
+  }
+
+  Outputs {
+    Name = "result"
+    Mime = "application/json"
+  }
+
+  Step {
+    Type = "s3-download"
+    Cmd = "\"$input_video\""
+  }
+
+  Step {
+    Type = "sh"
+    Cmd = "/bin/echo \"$input_video\" \"$output_result\""
+  }
+}
+
+Jobs {
+  Name = "test2"
+
+  Inputs {
+    Name = "video"
+    Mime = "application/mod"
+  }
+
+  Outputs {
+    Name = "result"
+    Mime = "application/json"
+  }
+
+  Step {
+    Type = "sh"
+    Cmd = "/bin/echo \"$input_video\" \"$output_result\""
+  }
+
+  Step {
+    Type = "s3-download"
+    Cmd = "\"$input_video\""
+  }
+}
+
+States {
+  Name = "test"
+  Kind = "running"
+  Order = 1
+}

+ 78 - 0
config/testdata/config.toml

@@ -0,0 +1,78 @@
+[net]
+  Id = 12245
+  Listen = "tcp:localhost:12345"
+  As = "tcp:10.0.0.1:12345"
+  Command = "unix:/tmp/bdjncl"
+
+[[peers]]
+  As = "tcp:localhost:12346"
+
+  [[peers.Skills]]
+    Name = "test"
+
+    [[peers.Skills.Inputs]]
+      Name = "video"
+      Mime = "application/mod"
+
+    [[peers.Skills.Outputs]]
+      Name = "result"
+      Mime = "application/json"
+
+[[peers]]
+  As = "tcp:localhost:12347"
+
+  [[peers.Skills]]
+    Name = "test"
+
+    [[peers.Skills.Inputs]]
+      Name = "video"
+      Mime = "application/mod"
+
+    [[peers.Skills.Outputs]]
+      Name = "result"
+      Mime = "application/json"
+
+[[jobs]]
+  [jobs.skill]
+    Name = "test"
+
+    [[jobs.skill.Inputs]]
+      Name = "video"
+      Mime = "application/mod"
+
+    [[jobs.skill.Outputs]]
+      Name = "result"
+      Mime = "application/json"
+
+  [[jobs.Step]]
+    Type = "s3-download"
+    Cmd = "\"$input_video\""
+
+  [[jobs.Step]]
+    Type = "sh"
+    Cmd = "/bin/echo \"$input_video\" \"$output_result\""
+
+[[jobs]]
+  [jobs.skill]
+    Name = "test2"
+
+    [[jobs.skill.Inputs]]
+      Name = "video"
+      Mime = "application/mod"
+
+    [[jobs.skill.Outputs]]
+      Name = "result"
+      Mime = "application/json"
+
+  [[jobs.Step]]
+    Type = "sh"
+    Cmd = "/bin/echo \"$input_video\" \"$output_result\""
+
+  [[jobs.Step]]
+    Type = "s3-download"
+    Cmd = "\"$input_video\""
+
+[[states]]
+  Name = "test"
+  Kind = "running"
+  Order = 1

+ 55 - 0
config/testdata/config.yaml

@@ -0,0 +1,55 @@
+net:
+  id: 12245
+  listen: tcp:localhost:12345
+  as: tcp:10.0.0.1:12345
+  command: unix:/tmp/bdjncl
+peers:
+- as: tcp:localhost:12346
+  skills:
+  - name: test
+    inputs:
+    - name: video
+      mime: application/mod
+    outputs:
+    - name: result
+      mime: application/json
+- as: tcp:localhost:12347
+  skills:
+  - name: test
+    inputs:
+    - name: video
+      mime: application/mod
+    outputs:
+    - name: result
+      mime: application/json
+jobs:
+- skill:
+    name: test
+    inputs:
+    - name: video
+      mime: application/mod
+    outputs:
+    - name: result
+      mime: application/json
+  step:
+  - type: s3-download
+    cmd: '"$input_video"'
+  - type: sh
+    cmd: /bin/echo "$input_video" "$output_result"
+- skill:
+    name: test2
+    inputs:
+    - name: video
+      mime: application/mod
+    outputs:
+    - name: result
+      mime: application/json
+  step:
+  - type: sh
+    cmd: /bin/echo "$input_video" "$output_result"
+  - type: s3-download
+    cmd: '"$input_video"'
+states:
+- name: test
+  kind: running
+  order: 1