diff --git a/custom/custom.go b/custom/custom.go index f184725..653c564 100644 --- a/custom/custom.go +++ b/custom/custom.go @@ -80,6 +80,35 @@ func changeConfigOptions(configOptionsJson *C.char) (CErr *C.char) { return C.CString("") } +//export generateConfig +func generateConfig(path *C.char) (res *C.char) { + defer shared.DeferPanicToError("generateConfig", func(err error) { + res = C.CString("error" + err.Error()) + }) + + config, err := generateConfigFromFile(C.GoString(path), *configOptions) + if err != nil { + return C.CString("error" + err.Error()) + } + return C.CString(config) +} + +func generateConfigFromFile(path string, configOpt shared.ConfigOptions) (string, error) { + content, err := os.ReadFile(path) + if err != nil { + return "", err + } + options, err := parseConfig(string(content)) + if err != nil { + return "", err + } + config, err := shared.BuildConfigJson(configOpt, options) + if err != nil { + return "", err + } + return config, nil +} + //export start func start(configPath *C.char, disableMemoryLimit bool) (CErr *C.char) { defer shared.DeferPanicToError("start", func(err error) { diff --git a/mobile/mobile.go b/mobile/mobile.go index 56d90ce..aec3734 100644 --- a/mobile/mobile.go +++ b/mobile/mobile.go @@ -28,7 +28,5 @@ func BuildConfig(path string, configOptionsJson string) (string, error) { if err != nil { return "", nil } - options = shared.BuildConfig(*configOptions, options) - config, err := json.Marshal(options) - return string(config), err + return shared.BuildConfigJson(*configOptions, options) } diff --git a/shared/config.go b/shared/config.go index e3f80d6..56952fa 100644 --- a/shared/config.go +++ b/shared/config.go @@ -1,6 +1,7 @@ package shared import ( + "bytes" "encoding/json" "fmt" "net" @@ -38,6 +39,19 @@ type ConfigOptions struct { Rules []Rule `json:"rules"` } +func BuildConfigJson(configOpt ConfigOptions, input option.Options) (string, error) { + options := BuildConfig(configOpt, input) + var buffer bytes.Buffer + json.NewEncoder(&buffer) + encoder := json.NewEncoder(&buffer) + encoder.SetIndent("", " ") + err := encoder.Encode(options) + if err != nil { + return "", err + } + return buffer.String(), nil +} + // TODO include selectors func BuildConfig(configOpt ConfigOptions, input option.Options) option.Options { if configOpt.ExecuteAsIs {