Skip to content

Commit 793a148

Browse files
committed
Add parsers package
1 parent 957a23f commit 793a148

File tree

5 files changed

+115
-34
lines changed

5 files changed

+115
-34
lines changed

src/gendiff.go

Lines changed: 2 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,16 @@
11
package code
22

33
import (
4-
"encoding/json"
5-
"errors"
4+
"code/src/parsers"
65
"fmt"
7-
"os"
86
"path/filepath"
97
"sort"
108
"strings"
11-
12-
"github.com/stretchr/testify/assert/yaml"
139
)
1410

1511
func GenDiff(path1, path2, format string) (string, error) {
1612
abs1, abs2 := toAbsolutePath(path1, path2)
17-
data1, data2, err := parseDataFromFiles(abs1, abs2)
13+
data1, data2, err := parsers.ParseDataFromFiles(abs1, abs2)
1814
if err != nil {
1915
return "", fmt.Errorf("parseDataFromFiles: %w", err)
2016
}
@@ -36,34 +32,6 @@ func toAbsolutePath(path1, path2 string) (p1, p2 string) {
3632
return abs1, abs2
3733
}
3834

39-
func parseDataFromFiles(path1, path2 string) (data1, data2 map[string]interface{}, err error) {
40-
dataFile1, _ := os.ReadFile(path1)
41-
dataFile2, _ := os.ReadFile(path2)
42-
var data11 map[string]interface{}
43-
var data22 map[string]interface{}
44-
switch {
45-
case filepath.Ext(path1) == ".json" && filepath.Ext(path2) == ".json":
46-
47-
if err := json.Unmarshal(dataFile1, &data11); err != nil {
48-
return nil, nil, errors.New("не удалось преобразовать из json")
49-
}
50-
if err := json.Unmarshal(dataFile2, &data22); err != nil {
51-
return nil, nil, errors.New("не удалось преобразовать из json")
52-
}
53-
return data11, data22, nil
54-
case filepath.Ext(path1) == ".yml" && filepath.Ext(path2) == ".yml":
55-
if err := yaml.Unmarshal(dataFile1, &data11); err != nil {
56-
return nil, nil, errors.New("не удалось преобразовать из yaml")
57-
}
58-
if err := yaml.Unmarshal(dataFile2, &data22); err != nil {
59-
return nil, nil, errors.New("не удалось преобразовать из yaml")
60-
}
61-
return data11, data22, nil
62-
default:
63-
return nil, nil, errors.New("неизвестный формат данных")
64-
}
65-
}
66-
6735
func genDiff(data1, data2 map[string]interface{}) string {
6836

6937
// Создаём множество ключей из обеих map

src/parsers/parsers.go

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package parsers
2+
3+
import (
4+
"encoding/json"
5+
"errors"
6+
"gopkg.in/yaml.v3"
7+
"os"
8+
"path/filepath"
9+
)
10+
11+
func ParseDataFromFiles(path1, path2 string) (res1, res2 map[string]interface{}, err error) {
12+
file1, err := os.ReadFile(path1)
13+
if err != nil {
14+
return nil, nil, errors.New("не удалось прочитать файл")
15+
}
16+
file2, err := os.ReadFile(path2)
17+
if err != nil {
18+
return nil, nil, errors.New("не удалось прочитать файл")
19+
}
20+
var data1 map[string]interface{}
21+
var data2 map[string]interface{}
22+
var ext1 = filepath.Ext(path1)
23+
var ext2 = filepath.Ext(path2)
24+
25+
switch {
26+
case ext1 == ".json" && ext2 == ".json":
27+
if err := json.Unmarshal(file1, &data1); err != nil {
28+
return nil, nil, errors.New("не удалось преобразовать из json")
29+
}
30+
if err := json.Unmarshal(file2, &data2); err != nil {
31+
return nil, nil, errors.New("не удалось преобразовать из json")
32+
}
33+
return data1, data2, nil
34+
35+
case ext1 == ".yaml" || ext1 == ".yml" && ext2 == ".yaml" || ext2 == ".yml":
36+
if err := yaml.Unmarshal(file1, &data1); err != nil {
37+
return nil, nil, errors.New("не удалось преобразовать из yaml")
38+
}
39+
if err := yaml.Unmarshal(file2, &data2); err != nil {
40+
return nil, nil, errors.New("не удалось преобразовать из yaml")
41+
}
42+
return data1, data2, nil
43+
44+
case ext1 != ext2:
45+
return nil, nil, errors.New("разные форматы данных")
46+
47+
default:
48+
return nil, nil, errors.New("неизвестный формат данных")
49+
}
50+
}

src/parsers/parsers_test.go

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package parsers
2+
3+
import (
4+
"errors"
5+
"path/filepath"
6+
"testing"
7+
8+
"github.com/stretchr/testify/assert"
9+
)
10+
11+
func TestParseDataFromFiles(t *testing.T) {
12+
var testCases = []struct {
13+
name string
14+
filename1 string
15+
filename2 string
16+
expected [3]interface{}
17+
}{
18+
{
19+
name: "BothFilesAreJson",
20+
filename1: filepath.Join("../../testdata/fixture/file1.json"),
21+
filename2: filepath.Join("../../testdata/fixture/file2.json"),
22+
expected: [3]interface{}{map[string]interface{}{"follow": false, "host": "hexlet.io", "proxy": "123.234.53.22", "timeout": float64(50)},
23+
map[string]interface{}{"host": "hexlet.io", "timeout": float64(20), "verbose": true}, nil},
24+
},
25+
{
26+
name: "BothFilesAreYaml",
27+
filename1: filepath.Join("../../testdata/fixture/file1.yml"),
28+
filename2: filepath.Join("../../testdata/fixture/file2.yml"),
29+
expected: [3]interface{}{map[string]interface{}{"follow": false, "host": "hexlet.io", "proxy": "123.234.53.22", "timeout": 50},
30+
map[string]interface{}{"host": "hexlet.io", "timeout": 20, "verbose": true}, nil},
31+
},
32+
{
33+
name: "WrongFormatFiles",
34+
filename1: filepath.Join("../../testdata/fixture/file1.pdf"),
35+
filename2: filepath.Join("../../testdata/fixture/file2.pdf"),
36+
expected: [3]interface{}{nil, nil, errors.New("неизвестный формат данных")},
37+
},
38+
{
39+
name: "DifferentFileFormats",
40+
filename1: filepath.Join("../../testdata/fixture/file1.json"),
41+
filename2: filepath.Join("../../testdata/fixture/file2.pdf"),
42+
expected: [3]interface{}{nil, nil, errors.New("разные форматы данных")},
43+
},
44+
}
45+
for _, tc := range testCases {
46+
t.Run(tc.name, func(t *testing.T) {
47+
got1, got2, err := ParseDataFromFiles(tc.filename1, tc.filename2)
48+
if got1 != nil && got2 != nil {
49+
assert.Equal(t, got1, tc.expected[0])
50+
assert.Equal(t, got2, tc.expected[1])
51+
} else {
52+
assert.Nil(t, got1)
53+
assert.Nil(t, got2)
54+
}
55+
expectedErr := tc.expected[2]
56+
if expectedErr == nil {
57+
assert.NoError(t, err)
58+
} else {
59+
assert.ErrorAs(t, err, &expectedErr)
60+
}
61+
})
62+
}
63+
}

testdata/fixture/file1.pdf

Whitespace-only changes.

testdata/fixture/file2.pdf

Whitespace-only changes.

0 commit comments

Comments
 (0)