diff options
| author | loyalsoldier <[email protected]> | 2021-08-27 18:27:16 +0800 |
|---|---|---|
| committer | loyalsoldier <[email protected]> | 2021-08-29 20:09:57 +0800 |
| commit | 85a343aca99d864c517f13cd3169ebcc910ec0d8 (patch) | |
| tree | eccfd3680d9dc6e22f265a9525dccac85902c2ab /lib/instance.go | |
| parent | 2b32e8845d9e55b6c23ebb41bd0f382100094386 (diff) | |
Refactor: use plugin architecture to support multiple I/O formats
Diffstat (limited to 'lib/instance.go')
| -rw-r--r-- | lib/instance.go | 73 |
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 +} |
