diff --git a/Sources/ContainerCommands/Machine/MachineList.swift b/Sources/ContainerCommands/Machine/MachineList.swift index 36770644..38b5b09e 100644 --- a/Sources/ContainerCommands/Machine/MachineList.swift +++ b/Sources/ContainerCommands/Machine/MachineList.swift @@ -61,10 +61,8 @@ extension Application { let printables = machines.map { PrintableMachine($0, isDefault: $0.id == defaultMachine) } - let encoder = JSONEncoder() - encoder.dateEncodingStrategy = .iso8601 - let data = try encoder.encode(printables) - print(String(decoding: data, as: UTF8.self)) + let options = JSONOptions(dateEncodingStrategy: .iso8601) + try Output.emit(Output.renderJSON(printables, options: options)) return } diff --git a/Sources/ContainerCommands/OutputRendering.swift b/Sources/ContainerCommands/OutputRendering.swift index 2f085dc9..91daadd9 100644 --- a/Sources/ContainerCommands/OutputRendering.swift +++ b/Sources/ContainerCommands/OutputRendering.swift @@ -44,7 +44,7 @@ public enum Output { /// Renders an `Encodable` value as a JSON string. public static func renderJSON(_ value: T, options: JSONOptions = .compact) throws -> String { let encoder = JSONEncoder() - encoder.outputFormatting = options.outputFormatting + encoder.outputFormatting = options.outputFormatting.union(.withoutEscapingSlashes) encoder.dateEncodingStrategy = options.dateEncodingStrategy let data = try encoder.encode(value) return String(decoding: data, as: UTF8.self) diff --git a/Tests/ContainerCommandsTests/ListFormattingTests.swift b/Tests/ContainerCommandsTests/ListFormattingTests.swift index 3c0c5be8..cb71ca9c 100644 --- a/Tests/ContainerCommandsTests/ListFormattingTests.swift +++ b/Tests/ContainerCommandsTests/ListFormattingTests.swift @@ -163,6 +163,15 @@ struct RenderJSONTests { #expect(!json.contains("\n")) } + @Test + func doesNotEscapeSlashes() throws { + let item = TestItem(id: "/foo/bar", name: "https://example.com/path") + let json = try Output.renderJSON(item) + #expect(json.contains("/foo/bar")) + #expect(json.contains("https://example.com/path")) + #expect(!json.contains("\\/")) + } + @Test func prettyIsMultiLine() throws { let items = [TestItem(id: "a", name: "b")]