@@ -4,62 +4,101 @@ import (
4
4
"encoding/json"
5
5
"errors"
6
6
"os"
7
+ "strings"
7
8
8
9
"github.com/tailscale/hujson"
9
10
)
10
11
11
- type Instance struct {
12
- config * config
12
+ type Instance interface {
13
+ InitConfig (configFile string ) error
14
+ InitConfigFromBytes (content []byte ) error
15
+ AddInput (InputConverter )
16
+ AddOutput (OutputConverter )
17
+ ResetInput ()
18
+ ResetOutput ()
19
+ RunInput (Container ) error
20
+ RunOutput (Container ) error
21
+ Run () error
22
+ }
23
+
24
+ type instance struct {
13
25
input []InputConverter
14
26
output []OutputConverter
15
27
}
16
28
17
- func NewInstance () (* Instance , error ) {
18
- return & Instance {
19
- config : new (config ),
29
+ func NewInstance () (Instance , error ) {
30
+ return & instance {
20
31
input : make ([]InputConverter , 0 ),
21
32
output : make ([]OutputConverter , 0 ),
22
33
}, nil
23
34
}
24
35
25
- func (i * Instance ) Init (configFile string ) error {
26
- content , err := os .ReadFile (configFile )
36
+ func (i * instance ) InitConfig (configFile string ) error {
37
+ var content []byte
38
+ var err error
39
+ configFile = strings .TrimSpace (configFile )
40
+ if strings .HasPrefix (strings .ToLower (configFile ), "http://" ) || strings .HasPrefix (strings .ToLower (configFile ), "https://" ) {
41
+ content , err = GetRemoteURLContent (configFile )
42
+ } else {
43
+ content , err = os .ReadFile (configFile )
44
+ }
27
45
if err != nil {
28
46
return err
29
47
}
30
48
49
+ return i .InitConfigFromBytes (content )
50
+ }
51
+
52
+ func (i * instance ) InitConfigFromBytes (content []byte ) error {
53
+ config := new (config )
54
+
31
55
// Support JSON with comments and trailing commas
32
56
content , _ = hujson .Standardize (content )
33
57
34
- if err := json .Unmarshal (content , & i . config ); err != nil {
58
+ if err := json .Unmarshal (content , & config ); err != nil {
35
59
return err
36
60
}
37
61
38
- for _ , input := range i . config .Input {
62
+ for _ , input := range config .Input {
39
63
i .input = append (i .input , input .converter )
40
64
}
41
65
42
- for _ , output := range i . config .Output {
66
+ for _ , output := range config .Output {
43
67
i .output = append (i .output , output .converter )
44
68
}
45
69
46
70
return nil
47
71
}
48
72
49
- func (i * Instance ) Run () error {
50
- if len (i .input ) == 0 || len (i .output ) == 0 {
51
- return errors .New ("input type and output type must be specified" )
52
- }
73
+ func (i * instance ) AddInput (ic InputConverter ) {
74
+ i .input = append (i .input , ic )
75
+ }
53
76
77
+ func (i * instance ) AddOutput (oc OutputConverter ) {
78
+ i .output = append (i .output , oc )
79
+ }
80
+
81
+ func (i * instance ) ResetInput () {
82
+ i .input = make ([]InputConverter , 0 )
83
+ }
84
+
85
+ func (i * instance ) ResetOutput () {
86
+ i .output = make ([]OutputConverter , 0 )
87
+ }
88
+
89
+ func (i * instance ) RunInput (container Container ) error {
54
90
var err error
55
- container := NewContainer ()
56
91
for _ , ic := range i .input {
57
92
container , err = ic .Input (container )
58
93
if err != nil {
59
94
return err
60
95
}
61
96
}
62
97
98
+ return nil
99
+ }
100
+
101
+ func (i * instance ) RunOutput (container Container ) error {
63
102
for _ , oc := range i .output {
64
103
if err := oc .Output (container ); err != nil {
65
104
return err
@@ -68,3 +107,21 @@ func (i *Instance) Run() error {
68
107
69
108
return nil
70
109
}
110
+
111
+ func (i * instance ) Run () error {
112
+ if len (i .input ) == 0 || len (i .output ) == 0 {
113
+ return errors .New ("input type and output type must be specified" )
114
+ }
115
+
116
+ container := NewContainer ()
117
+
118
+ if err := i .RunInput (container ); err != nil {
119
+ return err
120
+ }
121
+
122
+ if err := i .RunOutput (container ); err != nil {
123
+ return err
124
+ }
125
+
126
+ return nil
127
+ }
0 commit comments