Coverage Report

Created: 2026-03-26 06:24

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/swift-protobuf/Sources/SwiftProtobuf/PathVisitor.swift
Line
Count
Source
1
// Sources/SwiftProtobuf/PathVisitor.swift - Path visitor
2
//
3
// Copyright (c) 2014 - 2023 Apple Inc. and the project authors
4
// Licensed under Apache License v2.0 with Runtime Library Exception
5
//
6
// See LICENSE.txt for license information:
7
// https://github.com/apple/swift-protobuf/blob/main/LICENSE.txt
8
//
9
// -----------------------------------------------------------------------------
10
///
11
/// Visitor which captures a pair of paths and their values.
12
///
13
// -----------------------------------------------------------------------------
14
15
#if FieldMaskUtilities
16
17
#if canImport(FoundationEssentials)
18
import FoundationEssentials
19
#else
20
import Foundation
21
#endif
22
23
// Visitor captures all values of message with their paths
24
struct PathVisitor<T: Message>: Visitor {
25
26
    // The path contains parent components
27
    private let prevPath: String?
28
29
    // Captured values after visiting will be stored in this property
30
0
    private(set) var values: [String: Any] = [:]
31
32
0
    internal init(prevPath: String? = nil) {
33
0
        self.prevPath = prevPath
34
0
    }
35
36
0
    mutating private func visit(_ value: Any, fieldNumber: Int) {
37
0
        guard let name = T.name(for: fieldNumber) else {
38
0
            return
39
0
        }
40
0
        if let prevPath {
41
0
            values["\(prevPath).\(name)"] = value
42
0
        } else {
43
0
            values[name] = value
44
0
        }
45
0
    }
46
47
    mutating private func visitMessageField<M: Message>(
48
        _ value: M,
49
        fieldNumber: Int
50
0
    ) {
51
0
        guard var path = T.name(for: fieldNumber) else {
52
0
            return
53
0
        }
54
0
        if let prevPath {
55
0
            path = "\(prevPath).\(path)"
56
0
        }
57
0
        values[path] = value
58
0
        var visitor = PathVisitor<M>(prevPath: path)
59
0
        try? value.traverse(visitor: &visitor)
60
0
        values.merge(visitor.values) { _, new in
61
0
            new
62
0
        }
63
0
    }
64
65
0
    mutating func visitUnknown(bytes: Data) throws {}
66
67
0
    mutating func visitSingularFloatField(value: Float, fieldNumber: Int) throws {
68
0
        visit(value, fieldNumber: fieldNumber)
69
0
    }
70
71
0
    mutating func visitSingularDoubleField(value: Double, fieldNumber: Int) throws {
72
0
        visit(value, fieldNumber: fieldNumber)
73
0
    }
74
75
0
    mutating func visitSingularInt32Field(value: Int32, fieldNumber: Int) throws {
76
0
        visit(value, fieldNumber: fieldNumber)
77
0
    }
78
79
0
    mutating func visitSingularInt64Field(value: Int64, fieldNumber: Int) throws {
80
0
        visit(value, fieldNumber: fieldNumber)
81
0
    }
82
83
0
    mutating func visitSingularUInt32Field(value: UInt32, fieldNumber: Int) throws {
84
0
        visit(value, fieldNumber: fieldNumber)
85
0
    }
86
87
0
    mutating func visitSingularUInt64Field(value: UInt64, fieldNumber: Int) throws {
88
0
        visit(value, fieldNumber: fieldNumber)
89
0
    }
90
91
0
    mutating func visitSingularSInt32Field(value: Int32, fieldNumber: Int) throws {
92
0
        visit(value, fieldNumber: fieldNumber)
93
0
    }
94
95
0
    mutating func visitSingularSInt64Field(value: Int64, fieldNumber: Int) throws {
96
0
        visit(value, fieldNumber: fieldNumber)
97
0
    }
98
99
0
    mutating func visitSingularFixed32Field(value: UInt32, fieldNumber: Int) throws {
100
0
        visit(value, fieldNumber: fieldNumber)
101
0
    }
102
103
0
    mutating func visitSingularFixed64Field(value: UInt64, fieldNumber: Int) throws {
104
0
        visit(value, fieldNumber: fieldNumber)
105
0
    }
106
107
0
    mutating func visitSingularSFixed32Field(value: Int32, fieldNumber: Int) throws {
108
0
        visit(value, fieldNumber: fieldNumber)
109
0
    }
110
111
0
    mutating func visitSingularSFixed64Field(value: Int64, fieldNumber: Int) throws {
112
0
        visit(value, fieldNumber: fieldNumber)
113
0
    }
114
115
0
    mutating func visitSingularBoolField(value: Bool, fieldNumber: Int) throws {
116
0
        visit(value, fieldNumber: fieldNumber)
117
0
    }
118
119
0
    mutating func visitSingularStringField(value: String, fieldNumber: Int) throws {
120
0
        visit(value, fieldNumber: fieldNumber)
121
0
    }
122
123
0
    mutating func visitSingularBytesField(value: Data, fieldNumber: Int) throws {
124
0
        visit(value, fieldNumber: fieldNumber)
125
0
    }
126
127
0
    mutating func visitSingularEnumField<E: Enum>(value: E, fieldNumber: Int) throws {
128
0
        visit(value, fieldNumber: fieldNumber)
129
0
    }
130
131
0
    mutating func visitSingularMessageField<M: Message>(value: M, fieldNumber: Int) throws {
132
0
        visitMessageField(value, fieldNumber: fieldNumber)
133
0
    }
134
135
0
    mutating func visitSingularGroupField<G: Message>(value: G, fieldNumber: Int) throws {
136
0
        visitMessageField(value, fieldNumber: fieldNumber)
137
0
    }
138
139
0
    mutating func visitRepeatedFloatField(value: [Float], fieldNumber: Int) throws {
140
0
        visit(value, fieldNumber: fieldNumber)
141
0
    }
142
143
0
    mutating func visitRepeatedDoubleField(value: [Double], fieldNumber: Int) throws {
144
0
        visit(value, fieldNumber: fieldNumber)
145
0
    }
146
147
0
    mutating func visitRepeatedInt32Field(value: [Int32], fieldNumber: Int) throws {
148
0
        visit(value, fieldNumber: fieldNumber)
149
0
    }
150
151
0
    mutating func visitRepeatedInt64Field(value: [Int64], fieldNumber: Int) throws {
152
0
        visit(value, fieldNumber: fieldNumber)
153
0
    }
154
155
0
    mutating func visitRepeatedUInt32Field(value: [UInt32], fieldNumber: Int) throws {
156
0
        visit(value, fieldNumber: fieldNumber)
157
0
    }
158
159
0
    mutating func visitRepeatedUInt64Field(value: [UInt64], fieldNumber: Int) throws {
160
0
        visit(value, fieldNumber: fieldNumber)
161
0
    }
162
163
0
    mutating func visitRepeatedSInt32Field(value: [Int32], fieldNumber: Int) throws {
164
0
        visit(value, fieldNumber: fieldNumber)
165
0
    }
166
167
0
    mutating func visitRepeatedSInt64Field(value: [Int64], fieldNumber: Int) throws {
168
0
        visit(value, fieldNumber: fieldNumber)
169
0
    }
170
171
0
    mutating func visitRepeatedFixed32Field(value: [UInt32], fieldNumber: Int) throws {
172
0
        visit(value, fieldNumber: fieldNumber)
173
0
    }
174
175
0
    mutating func visitRepeatedFixed64Field(value: [UInt64], fieldNumber: Int) throws {
176
0
        visit(value, fieldNumber: fieldNumber)
177
0
    }
178
179
0
    mutating func visitRepeatedSFixed32Field(value: [Int32], fieldNumber: Int) throws {
180
0
        visit(value, fieldNumber: fieldNumber)
181
0
    }
182
183
0
    mutating func visitRepeatedSFixed64Field(value: [Int64], fieldNumber: Int) throws {
184
0
        visit(value, fieldNumber: fieldNumber)
185
0
    }
186
187
0
    mutating func visitRepeatedBoolField(value: [Bool], fieldNumber: Int) throws {
188
0
        visit(value, fieldNumber: fieldNumber)
189
0
    }
190
191
0
    mutating func visitRepeatedStringField(value: [String], fieldNumber: Int) throws {
192
0
        visit(value, fieldNumber: fieldNumber)
193
0
    }
194
195
0
    mutating func visitRepeatedBytesField(value: [Data], fieldNumber: Int) throws {
196
0
        visit(value, fieldNumber: fieldNumber)
197
0
    }
198
199
0
    mutating func visitRepeatedEnumField<E: Enum>(value: [E], fieldNumber: Int) throws {
200
0
        visit(value, fieldNumber: fieldNumber)
201
0
    }
202
203
0
    mutating func visitRepeatedMessageField<M>(value: [M], fieldNumber: Int) throws where M: Message {
204
0
        visit(value, fieldNumber: fieldNumber)
205
0
    }
206
207
0
    mutating func visitRepeatedGroupField<G: Message>(value: [G], fieldNumber: Int) throws {
208
0
        visit(value, fieldNumber: fieldNumber)
209
0
    }
210
211
0
    mutating func visitPackedFloatField(value: [Float], fieldNumber: Int) throws {
212
0
        visit(value, fieldNumber: fieldNumber)
213
0
    }
214
215
0
    mutating func visitPackedDoubleField(value: [Double], fieldNumber: Int) throws {
216
0
        visit(value, fieldNumber: fieldNumber)
217
0
    }
218
219
0
    mutating func visitPackedInt32Field(value: [Int32], fieldNumber: Int) throws {
220
0
        visit(value, fieldNumber: fieldNumber)
221
0
    }
222
223
0
    mutating func visitPackedInt64Field(value: [Int64], fieldNumber: Int) throws {
224
0
        visit(value, fieldNumber: fieldNumber)
225
0
    }
226
227
0
    mutating func visitPackedUInt32Field(value: [UInt32], fieldNumber: Int) throws {
228
0
        visit(value, fieldNumber: fieldNumber)
229
0
    }
230
231
0
    mutating func visitPackedUInt64Field(value: [UInt64], fieldNumber: Int) throws {
232
0
        visit(value, fieldNumber: fieldNumber)
233
0
    }
234
235
0
    mutating func visitPackedSInt32Field(value: [Int32], fieldNumber: Int) throws {
236
0
        visit(value, fieldNumber: fieldNumber)
237
0
    }
238
239
0
    mutating func visitPackedSInt64Field(value: [Int64], fieldNumber: Int) throws {
240
0
        visit(value, fieldNumber: fieldNumber)
241
0
    }
242
243
0
    mutating func visitPackedFixed32Field(value: [UInt32], fieldNumber: Int) throws {
244
0
        visit(value, fieldNumber: fieldNumber)
245
0
    }
246
247
0
    mutating func visitPackedFixed64Field(value: [UInt64], fieldNumber: Int) throws {
248
0
        visit(value, fieldNumber: fieldNumber)
249
0
    }
250
251
0
    mutating func visitPackedSFixed32Field(value: [Int32], fieldNumber: Int) throws {
252
0
        visit(value, fieldNumber: fieldNumber)
253
0
    }
254
255
0
    mutating func visitPackedSFixed64Field(value: [Int64], fieldNumber: Int) throws {
256
0
        visit(value, fieldNumber: fieldNumber)
257
0
    }
258
259
0
    mutating func visitPackedBoolField(value: [Bool], fieldNumber: Int) throws {
260
0
        visit(value, fieldNumber: fieldNumber)
261
0
    }
262
263
0
    mutating func visitPackedEnumField<E: Enum>(value: [E], fieldNumber: Int) throws {
264
0
        visit(value, fieldNumber: fieldNumber)
265
0
    }
266
267
    mutating func visitMapField<KeyType, ValueType>(
268
        fieldType: _ProtobufMap<KeyType, ValueType>.Type,
269
        value: _ProtobufMap<KeyType, ValueType>.BaseType,
270
        fieldNumber: Int
271
0
    ) throws where KeyType: MapKeyType, ValueType: MapValueType {
272
0
        visit(value, fieldNumber: fieldNumber)
273
0
    }
274
275
    mutating func visitMapField<KeyType, ValueType>(
276
        fieldType: _ProtobufEnumMap<KeyType, ValueType>.Type,
277
        value: _ProtobufEnumMap<KeyType, ValueType>.BaseType,
278
        fieldNumber: Int
279
0
    ) throws where KeyType: MapKeyType, ValueType: Enum, ValueType.RawValue == Int {
280
0
        visit(value, fieldNumber: fieldNumber)
281
0
    }
282
283
    mutating func visitMapField<KeyType, ValueType>(
284
        fieldType: _ProtobufMessageMap<KeyType, ValueType>.Type,
285
        value: _ProtobufMessageMap<KeyType, ValueType>.BaseType,
286
        fieldNumber: Int
287
0
    ) throws where KeyType: MapKeyType, ValueType: Hashable, ValueType: Message {
288
0
        visit(value, fieldNumber: fieldNumber)
289
0
    }
290
}
291
292
#endif