|
1 | 1 | package hexlet.code; |
2 | 2 |
|
| 3 | +import hexlet.code.formatters.Formatter; |
| 4 | + |
3 | 5 | import java.io.IOException; |
4 | | -import java.util.Map; |
5 | | -import java.util.Set; |
6 | | -import java.util.TreeSet; |
| 6 | +import java.util.*; |
7 | 7 |
|
8 | 8 | public class Differ { |
9 | 9 |
|
10 | | - public static String generate(String filePath1, String filePath2) throws IOException { |
| 10 | + public static String generate(String filePath1, String filePath2, String format) throws IOException { |
11 | 11 | // Используем новый Parser для обработки разных форматов |
12 | 12 | Map<String, Object> fileInfo1 = Parser.parse(filePath1); |
13 | 13 | Map<String, Object> fileInfo2 = Parser.parse(filePath2); |
14 | 14 |
|
15 | | - return generateDiff(fileInfo1, fileInfo2); |
| 15 | + List<Map<String, Object>> diff = calculateDiff(fileInfo1, fileInfo2); |
| 16 | + |
| 17 | + return Formatter.format(diff, format); |
16 | 18 | } |
17 | 19 |
|
18 | | - public static String generateDiff(Map<String, Object> fileInfo1, Map<String, Object> fileInfo2) { |
| 20 | + public static List<Map<String, Object>> calculateDiff(Map<String, Object> fileInfo1, Map<String, Object> fileInfo2) { |
19 | 21 | Set<String> allKeys = new TreeSet<>(); |
20 | 22 | allKeys.addAll(fileInfo1.keySet()); |
21 | 23 | allKeys.addAll(fileInfo2.keySet()); |
22 | 24 |
|
23 | | - StringBuilder differences = new StringBuilder("\n{\n"); |
| 25 | + List<Map<String, Object>> diff = new ArrayList<>(); |
24 | 26 |
|
25 | 27 | for (String key : allKeys) { |
26 | | - Object value1 = fileInfo1.getOrDefault(key, null); |
27 | | - Object value2 = fileInfo2.getOrDefault(key, null); |
| 28 | + Object value1 = fileInfo1.get(key); |
| 29 | + Object value2 = fileInfo2.get(key); |
28 | 30 |
|
29 | | - if (value1 != null && value2 != null && value1.equals(value2)) { |
30 | | - differences.append(" ").append(key).append(": ").append(value1).append("\n"); |
| 31 | + Map<String, Object> diffEntry = new HashMap<>(); |
| 32 | + diffEntry.put("key", key); |
| 33 | + |
| 34 | + if (!fileInfo1.containsKey(key)) { |
| 35 | + // Ключ был добавлен во второй файл |
| 36 | + diffEntry.put("type", "added"); |
| 37 | + diffEntry.put("newValue", value2); |
| 38 | + } else if (!fileInfo2.containsKey(key)) { |
| 39 | + // Ключ был удалён |
| 40 | + diffEntry.put("type", "removed"); |
| 41 | + diffEntry.put("oldValue", value1); |
| 42 | + } else if (Objects.equals(value1, value2)) { |
| 43 | + // Значение осталось неизменным |
| 44 | + diffEntry.put("type", "unchanged"); |
| 45 | + diffEntry.put("value", value1); |
31 | 46 | } else { |
32 | | - if (fileInfo1.containsKey(key)) { // Ключ был в первом файле |
33 | | - differences.append(" - ").append(key).append(": ").append(value1).append("\n"); |
34 | | - } |
35 | | - if (fileInfo2.containsKey(key)) { // Ключ был во втором файле |
36 | | - differences.append(" + ").append(key).append(": ").append(value2).append("\n"); |
37 | | - } |
| 47 | + // Значение изменилось |
| 48 | + diffEntry.put("type", "updated"); |
| 49 | + diffEntry.put("oldValue", value1); |
| 50 | + diffEntry.put("newValue", value2); |
38 | 51 | } |
| 52 | + |
| 53 | + diff.add(diffEntry); |
39 | 54 | } |
40 | 55 |
|
41 | | - differences.append("}\n"); |
42 | | - return differences.toString(); |
| 56 | + return diff; |
43 | 57 | } |
44 | 58 | } |
45 | 59 |
|
|
0 commit comments