Skip to content

Commit 28cfe32

Browse files
authored
Merge pull request #4 from SwiftRex/recursiveDiffFilter
Recursive diff: add simple filter option
2 parents b9856b2 + a94a7ed commit 28cfe32

File tree

2 files changed

+57
-7
lines changed

2 files changed

+57
-7
lines changed

β€ŽSources/LoggerMiddleware/LoggerMiddleware.swiftβ€Ž

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ extension LoggerMiddleware {
125125
public enum StateDiffTransform {
126126
case diff(linesOfContext: Int = 2, prefixLines: String = "πŸ› ")
127127
case newStateOnly
128-
case recursive(prefixLines: String = "πŸ› ", stateName: String)
128+
case recursive(prefixLines: String = "πŸ› ", stateName: String, filters: [String]? = nil)
129129
case custom((StateType?, StateType) -> String?)
130130

131131
func transform(oldState: StateType?, newState: StateType) -> String? {
@@ -137,20 +137,20 @@ extension LoggerMiddleware {
137137
?? "\(prefixLines) No state mutation"
138138
case .newStateOnly:
139139
return dumpToString(newState)
140-
case let .recursive(prefixLines, stateName):
141-
return recursiveDiff(prefixLines: prefixLines, stateName: stateName, before: oldState, after: newState)
140+
case let .recursive(prefixLines, stateName, filters):
141+
return recursiveDiff(prefixLines: prefixLines, stateName: stateName, filters: filters, before: oldState, after: newState)
142142
case let .custom(closure):
143143
return closure(oldState, newState)
144144
}
145145
}
146146
}
147147

148-
public static func recursiveDiff(prefixLines: String, stateName: String, before: StateType?, after: StateType) -> String? {
148+
public static func recursiveDiff(prefixLines: String, stateName: String, filters: [String]? = nil, before: StateType?, after: StateType) -> String? {
149149
// cuts the redundant newline character from the output
150-
diff(prefix: prefixLines, name: stateName, lhs: before, rhs: after)?.trimmingCharacters(in: .whitespacesAndNewlines)
150+
diff(prefix: prefixLines, name: stateName, filters: filters, lhs: before, rhs: after)?.trimmingCharacters(in: .whitespacesAndNewlines)
151151
}
152152

153-
private static func diff<A>(prefix: String, name: String, level: Int = 0, lhs: A?, rhs: A?) -> String? {
153+
private static func diff<A>(prefix: String, name: String, level: Int = 0, filters: [String]? = nil, lhs: A?, rhs: A?) -> String? {
154154

155155
guard let rightHandSide = rhs, let leftHandSide = lhs else {
156156
if let rightHandSide = rhs {
@@ -215,9 +215,17 @@ extension LoggerMiddleware {
215215
return Self.diff(prefix: "\(prefix)\(toDotOrNotToDot)\(name)",
216216
name: leftChild.label ?? "#", // label might be missing for items in collections, # represents a collection element
217217
level: level + 1,
218+
filters: filters,
218219
lhs: leftChild.value,
219220
rhs: rightMirror.children.first(where: { $0.label == leftChild.label })?.value)
220-
}).compactMap { $0 }
221+
})
222+
.compactMap { $0 }
223+
.filter { (diffLine: String) -> Bool in
224+
// filter diffLine if it contains a filterString
225+
false == (filters ?? []).contains(where: { filterString in
226+
diffLine.contains(filterString)
227+
})
228+
}
221229

222230
if strings.count > 0 {
223231
return strings.joined(separator: "\n")

β€ŽTests/LoggerMiddlewareTests/LoggerMiddlewareTests.swiftβ€Ž

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,48 @@ final class LoggerMiddlewareTests: XCTestCase {
6767
XCTAssertEqual(result, expected)
6868
}
6969

70+
71+
func testStateDiffWithFilters() {
72+
// given
73+
let beforeState: LoggerMiddleware<TestMiddleware>.StateType = TestState(a: Substate(x: ["SetB", "SetA"],
74+
y1: ["one": 1, "eleven": 11],
75+
y2: ["one": 1, "eleven": 11, "zapp": 42],
76+
z: true),
77+
b: [0, 1],
78+
c: "Foo",
79+
d: "✨",
80+
e: nil)
81+
let afterState: LoggerMiddleware<TestMiddleware>.StateType = TestState(a: Substate(x: ["SetB", "SetC"],
82+
y1: ["one": 1, "twelve": 12],
83+
y2: ["one": 1, "twelve": 12, "zapp": nil],
84+
z: false),
85+
b: [0],
86+
c: "Bar",
87+
d: nil,
88+
e: "πŸ₯š")
89+
90+
// when
91+
let result: String? = LoggerMiddleware<TestMiddleware>.recursiveDiff(prefixLines: "πŸ›",
92+
stateName: "TestState",
93+
filters: [
94+
" TestState.a.y2",
95+
" TestState.b.#"
96+
],
97+
before: beforeState,
98+
after: afterState)
99+
100+
// then
101+
let expected = """
102+
πŸ› TestState.a.x: πŸ“¦ <SetA, SetB> β†’ <SetB, SetC>
103+
πŸ› TestState.a.y1: πŸ“¦ [eleven: 11, one: 1] β†’ [one: 1, twelve: 12]
104+
πŸ› TestState.a.z: true β†’ false
105+
πŸ› TestState.c: Foo β†’ Bar
106+
πŸ› TestState.d.some: ✨ β†’ nil
107+
πŸ› TestState.e: nil β†’ Optional("πŸ₯š")
108+
"""
109+
XCTAssertEqual(result, expected)
110+
}
111+
70112
static var allTests = [
71113
("testStateDiff", testStateDiff),
72114
]

0 commit comments

Comments
Β (0)