From 7b963707f2574499a96664ddc6f228e5fc3ac651 Mon Sep 17 00:00:00 2001 From: eldoradoel <1123368949@qq.com> Date: Tue, 6 Jun 2023 17:42:10 +0800 Subject: [PATCH] Add function to export vdf string from a map --- dumper.go | 35 +++++++++++++++++++++++++++++++++++ dumper_test.go | 27 +++++++++++++++++++++++++++ 2 files changed, 62 insertions(+) create mode 100644 dumper.go create mode 100644 dumper_test.go diff --git a/dumper.go b/dumper.go new file mode 100644 index 0000000..dc9eb2b --- /dev/null +++ b/dumper.go @@ -0,0 +1,35 @@ +package vdf + +import ( + "errors" + "fmt" + "strings" +) + +func newDumper(vdfMap map[string]interface{}) (string, error) { + var outBuilder strings.Builder + err := recursiveMap(vdfMap, 0, &outBuilder) + if err != nil { + return "", err + } + return outBuilder.String(), nil +} + +func recursiveMap(m map[string]interface{}, depth int, outBuilder *strings.Builder) error { + for key, value := range m { + switch valueType := value.(type) { + case map[string]interface{}: + outBuilder.WriteString(fmt.Sprintf("%s\"%s\"\n%s{\n", strings.Repeat("\t", depth), key, strings.Repeat("\t", depth))) + err := recursiveMap(valueType, depth+1, outBuilder) + if err != nil { + return err + } + outBuilder.WriteString(fmt.Sprintf("%s}\n", strings.Repeat("\t", depth))) + case string: + outBuilder.WriteString(fmt.Sprintf("%s\"%s\"\t\t\"%s\"\n", strings.Repeat("\t", depth), key, value)) + default: + return errors.New("Unsupported value type") + } + } + return nil +} diff --git a/dumper_test.go b/dumper_test.go new file mode 100644 index 0000000..fcb64a6 --- /dev/null +++ b/dumper_test.go @@ -0,0 +1,27 @@ +package vdf + +import ( + "fmt" + "strings" + "testing" +) + +func TestNewDumper(t *testing.T) { + testMap1 := map[string]interface{}{"map1": map[string]interface{}{"key1": "test1", "key2": "test2", + "map2": map[string]interface{}{"key3": "test3", "key4": "test4"}}, + "map3": map[string]interface{}{"key5": "test5", "key6": "test6"}} + testMap2 := map[string]interface{}{"map1": map[string]interface{}{"key1": "test1", "key2": "test2", + "map2": []string{"key5", "key6"}}, + "map3": map[string]interface{}{"key5": "test5", "key6": "test6"}} + vdfString, err := newDumper(testMap1) + fmt.Println(vdfString, err) + reader := strings.NewReader(vdfString) + p := NewParser(reader) + m, err := p.Parse() + if err != nil { + panic(err) + } + fmt.Println(m) + vdfString, err = newDumper(testMap2) + fmt.Println(vdfString, err) +}