summaryrefslogtreecommitdiff
path: root/lib/instance.go
diff options
context:
space:
mode:
authorloyalsoldier <[email protected]>2021-08-27 18:27:16 +0800
committerloyalsoldier <[email protected]>2021-08-29 20:09:57 +0800
commit85a343aca99d864c517f13cd3169ebcc910ec0d8 (patch)
treeeccfd3680d9dc6e22f265a9525dccac85902c2ab /lib/instance.go
parent2b32e8845d9e55b6c23ebb41bd0f382100094386 (diff)
Refactor: use plugin architecture to support multiple I/O formats
Diffstat (limited to 'lib/instance.go')
-rw-r--r--lib/instance.go73
1 files changed, 73 insertions, 0 deletions
diff --git a/lib/instance.go b/lib/instance.go
new file mode 100644
index 00000000..e7bcbf41
--- /dev/null
+++ b/lib/instance.go
@@ -0,0 +1,73 @@
+package lib
+
+import (
+ "encoding/json"
+ "errors"
+ "os"
+ "strings"
+)
+
+type Instance struct {
+ config *config
+ input []InputConverter
+ output []OutputConverter
+}
+
+func NewInstance() (*Instance, error) {
+ return &Instance{
+ config: new(config),
+ input: make([]InputConverter, 0),
+ output: make([]OutputConverter, 0),
+ }, nil
+}
+
+func (i *Instance) Init(configFile string) error {
+ var content []byte
+ var err error
+ configFile = strings.TrimSpace(configFile)
+ if strings.HasPrefix(configFile, "http://") || strings.HasPrefix(configFile, "https://") {
+ content, err = getRemoteURLContent(configFile)
+ } else {
+ content, err = os.ReadFile(configFile)
+ }
+ if err != nil {
+ return err
+ }
+
+ if err := json.Unmarshal(content, &i.config); err != nil {
+ return err
+ }
+
+ for _, input := range i.config.Input {
+ i.input = append(i.input, input.converter)
+ }
+
+ for _, output := range i.config.Output {
+ i.output = append(i.output, output.converter)
+ }
+
+ return nil
+}
+
+func (i *Instance) Run() error {
+ if len(i.input) == 0 || len(i.output) == 0 {
+ return errors.New("input type and output type must be specified")
+ }
+
+ var err error
+ container := NewContainer()
+ for _, ic := range i.input {
+ container, err = ic.Input(container)
+ if err != nil {
+ return err
+ }
+ }
+
+ for _, oc := range i.output {
+ if err := oc.Output(container); err != nil {
+ return err
+ }
+ }
+
+ return nil
+}