Created
July 21, 2019 06:08
-
-
Save raunakp/16155d19d005939f1297b7c6cb6f890c to your computer and use it in GitHub Desktop.
pretty print nested composite object graph confirming to CustomDebugStringConvertible protocol
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import Foundation | |
class StringUtils { | |
static func appendIfValuePresent(key: String, value: AnyHashable?, toArray array: inout [String], separator: String = ": ") { | |
if let value = value { | |
array.append("\(key)\(separator)\(value)") | |
} | |
} | |
} | |
struct PrettyPrintableComponent { | |
var indentationLevel = 0 | |
var indentationSeparator = "\t" | |
var lineSeparator = "\n" | |
} | |
protocol HasPrettyPrintableComponent { | |
var prettyPrintableComponent: PrettyPrintableComponent { get set } | |
} | |
protocol PrettyDebugPrintable: HasPrettyPrintableComponent, CustomDebugStringConvertible { } | |
extension PrettyDebugPrintable { | |
var indentationLevel: Int { | |
get { return prettyPrintableComponent.indentationLevel } | |
set { prettyPrintableComponent.indentationLevel = newValue } | |
} | |
var indentationSeparator: String { | |
get { return prettyPrintableComponent.indentationSeparator } | |
set { prettyPrintableComponent.indentationSeparator = newValue } | |
} | |
var lineSeparator: String { | |
get { return prettyPrintableComponent.lineSeparator } | |
set { prettyPrintableComponent.lineSeparator = newValue } | |
} | |
} | |
class Address: PrettyDebugPrintable { | |
var city: String? = "B'lore" | |
var country: String? = "India" | |
var pincode: String? = nil | |
var prettyPrintableComponent = PrettyPrintableComponent() | |
var debugDescription: String { | |
var components = [String]() | |
StringUtils.appendIfValuePresent(key: "city", value: city, toArray: &components) | |
StringUtils.appendIfValuePresent(key: "country", value: country, toArray: &components) | |
StringUtils.appendIfValuePresent(key: "pincode", value: pincode, toArray: &components) | |
let indentationSeparator = String.init(repeating: prettyPrintableComponent.indentationSeparator, count: prettyPrintableComponent.indentationLevel) | |
let debugStr = indentationSeparator + components.joined(separator: prettyPrintableComponent.lineSeparator + indentationSeparator) | |
return debugStr | |
} | |
} | |
class Contact: PrettyDebugPrintable { | |
var phNum: String? = "111-222-33" | |
var email: String? = "[email protected]" | |
var address: Address? = Address() | |
var prettyPrintableComponent = PrettyPrintableComponent() | |
var debugDescription: String { | |
var components = [String]() | |
StringUtils.appendIfValuePresent(key: "phNum", value: phNum, toArray: &components) | |
StringUtils.appendIfValuePresent(key: "email", value: email, toArray: &components) | |
address?.prettyPrintableComponent.indentationLevel = self.prettyPrintableComponent.indentationLevel + 1 | |
StringUtils.appendIfValuePresent(key: "address", value: address?.debugDescription, toArray: &components, separator: ":\n") | |
let indentationSeparator = String.init(repeating: prettyPrintableComponent.indentationSeparator, count: prettyPrintableComponent.indentationLevel) | |
let debugStr = indentationSeparator + components.joined(separator: prettyPrintableComponent.lineSeparator + indentationSeparator) | |
return debugStr | |
} | |
} | |
class Student: PrettyDebugPrintable { | |
var name = "ron" | |
var contact: Contact? = Contact() | |
var prettyPrintableComponent = PrettyPrintableComponent() | |
var debugDescription: String { | |
var components = [String]() | |
StringUtils.appendIfValuePresent(key: "name", value: name, toArray: &components) | |
contact?.prettyPrintableComponent.indentationLevel = self.prettyPrintableComponent.indentationLevel + 1 | |
StringUtils.appendIfValuePresent(key: "contact", value: contact?.debugDescription, toArray: &components, separator: ":\n") | |
let indentationSeparator = String.init(repeating: prettyPrintableComponent.indentationSeparator, count: prettyPrintableComponent.indentationLevel) | |
let debugStr = indentationSeparator + components.joined(separator: prettyPrintableComponent.lineSeparator + indentationSeparator) | |
return debugStr | |
} | |
} | |
let student = Student() | |
print(student) | |
// output | |
/* | |
name: ron | |
contact: | |
phNum: 111-222-33 | |
email: [email protected] | |
address: | |
city: B'lore | |
country: India | |
*/ | |
/*
name: ron
contact:
phNum: 111-222-33
email: [email protected]
address:
city: B'lore
country: India
*/
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
https://stackoverflow.com/questions/57130270/how-to-pretty-print-a-nested-composite-object-structure-conforming-to-customdebu