Skip to content

Commit 30a13aa

Browse files
authored
Merge pull request #177 from drmohundro/fix-for-filter-plus-serialization
Fix issue with filter plus serialization
2 parents c7cd744 + 9aafb10 commit 30a13aa

File tree

2 files changed

+26
-16
lines changed

2 files changed

+26
-16
lines changed

Source/SWXMLHash.swift

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -570,14 +570,10 @@ public enum XMLIndexer {
570570
public func filter(_ included: (_ elem: XMLElement, _ index: Int) -> Bool) -> XMLIndexer {
571571
switch self {
572572
case .list(let list):
573-
let results = filterWithIndex(seq: list, included: included)
574-
if results.count == 1 {
575-
return XMLIndexer.element(results.first!)
576-
}
577-
return XMLIndexer.list(results)
573+
return handleFilteredResults(list: list, included: included)
578574

579575
case .element(let elem):
580-
return XMLIndexer.list(filterWithIndex(seq: elem.xmlChildren, included: included))
576+
return handleFilteredResults(list: elem.xmlChildren, included: included)
581577

582578
case .stream(let ops):
583579
let found = ops.findElements()
@@ -588,20 +584,21 @@ public enum XMLIndexer {
588584
} else {
589585
list = found.all.map { $0.element! }
590586
}
591-
let results = filterWithIndex(seq: list, included: included)
592-
if results.count == 1 {
593-
return XMLIndexer.element(results.first!)
594-
}
595-
return XMLIndexer.list(results)
587+
588+
return handleFilteredResults(list: list, included: included)
596589

597590
default:
598-
return XMLIndexer.list([])
591+
return .list([])
599592
}
600593
}
601594

602-
private func filterWithIndex(seq: [XMLElement],
603-
included: (_ elem: XMLElement, _ index: Int) -> Bool) -> [XMLElement] {
604-
return zip(seq.indices, seq).filter { included($1, $0) }.map { $1 }
595+
private func handleFilteredResults(list: [XMLElement],
596+
included: (_ elem: XMLElement, _ index: Int) -> Bool) -> XMLIndexer {
597+
let results = zip(list.indices, list).filter { included($1, $0) }.map { $1 }
598+
if results.count == 1 {
599+
return .element(results.first!)
600+
}
601+
return .list(results)
605602
}
606603

607604
/// All child elements from the currently indexed level

Tests/SWXMLHashTests/TypeConversionArrayOfNonPrimitiveTypesTests.swift

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,18 @@ class TypeConversionArrayOfNonPrimitiveTypesTests: XCTestCase {
212212
}
213213
}
214214
}
215+
216+
func testFilterAndSerializationShouldWork() {
217+
do {
218+
let subParser = parser!["root"]["arrayOfGoodBasicItems"].filter({ _, idx in idx == 0 })
219+
220+
let value: BasicItem = try subParser.value()
221+
222+
XCTAssertNotNil(value)
223+
} catch {
224+
XCTFail("\(error)")
225+
}
226+
}
215227
}
216228

217229
extension TypeConversionArrayOfNonPrimitiveTypesTests {
@@ -229,7 +241,8 @@ extension TypeConversionArrayOfNonPrimitiveTypesTests {
229241
("testShouldConvertArrayOfGoodAttributeItemsToArrayOfOptionals", testShouldConvertArrayOfGoodAttributeItemsToArrayOfOptionals),
230242
("testShouldThrowWhenConvertingArrayOfBadAttributeItemsToNonOptional", testShouldThrowWhenConvertingArrayOfBadAttributeItemsToNonOptional),
231243
("testShouldThrowWhenConvertingArrayOfBadAttributeItemsToOptional", testShouldThrowWhenConvertingArrayOfBadAttributeItemsToOptional),
232-
("testShouldThrowWhenConvertingArrayOfBadAttributeItemsToArrayOfOptionals", testShouldThrowWhenConvertingArrayOfBadAttributeItemsToArrayOfOptionals)
244+
("testShouldThrowWhenConvertingArrayOfBadAttributeItemsToArrayOfOptionals", testShouldThrowWhenConvertingArrayOfBadAttributeItemsToArrayOfOptionals),
245+
("testFilterAndSerializationShouldWork", testFilterAndSerializationShouldWork)
233246
]
234247
}
235248
}

0 commit comments

Comments
 (0)