diff --git a/Sources/XMLCoder/Decoder/XMLDecoder.swift b/Sources/XMLCoder/Decoder/XMLDecoder.swift index ed90218b..f110ee64 100644 --- a/Sources/XMLCoder/Decoder/XMLDecoder.swift +++ b/Sources/XMLCoder/Decoder/XMLDecoder.swift @@ -382,10 +382,5 @@ import protocol OpenCombine.TopLevelEncoder #if canImport(Combine) || canImport(OpenCombine) extension XMLDecoder: TopLevelDecoder {} - -extension XMLEncoder: TopLevelEncoder { - public func encode(_ value: T) throws -> Data where T: Encodable { - try encode(value, withRootKey: nil, rootAttributes: nil, header: nil) - } -} +extension XMLEncoder: TopLevelEncoder {} #endif diff --git a/Sources/XMLCoder/Encoder/XMLEncoder.swift b/Sources/XMLCoder/Encoder/XMLEncoder.swift index db1ff7cc..09732c63 100644 --- a/Sources/XMLCoder/Encoder/XMLEncoder.swift +++ b/Sources/XMLCoder/Encoder/XMLEncoder.swift @@ -376,6 +376,14 @@ open class XMLEncoder { return element.toXMLString(with: header, formatting: outputFormatting) .data(using: .utf8, allowLossyConversion: true)! } + + // MARK: - TopLevelEncoder + + #if canImport(Combine) || canImport(OpenCombine) + open func encode(_ value: T) throws -> Data where T: Encodable { + return try encode(value, withRootKey: nil, rootAttributes: nil, header: nil) + } + #endif } private extension String { diff --git a/Tests/XMLCoderTests/CombineTests.swift b/Tests/XMLCoderTests/CombineTests.swift index c3d4b747..e342f3fd 100644 --- a/Tests/XMLCoderTests/CombineTests.swift +++ b/Tests/XMLCoderTests/CombineTests.swift @@ -27,6 +27,12 @@ private struct Foo: Codable { var name: String } +final class CustomEncoder: XMLEncoder { + override func encode(_ value: T) throws -> Data where T: Encodable { + return try encode(value, withRootKey: "bar", rootAttributes: nil, header: nil) + } +} + @available(iOS 13.0, macOS 10.15.0, tvOS 13.0, watchOS 6.0, *) final class CombineTests: XCTestCase { func testDecode() { @@ -51,5 +57,21 @@ final class CombineTests: XCTestCase { ) XCTAssertEqual(foo?.name, "Foo") } + + func testCustomEncode() { + var foo: Data? + _ = Just(Foo(name: "Foo")) + .encode(encoder: CustomEncoder()) + .sink( + receiveCompletion: { _ in }, + receiveValue: { + foo = $0 + } + ) + XCTAssertEqual( + String(data: foo!, encoding: .utf8)!, + "Foo" + ) + } } #endif