// swiftlint:disable all // Generated using SwiftGen — https://github.com/SwiftGen/SwiftGen {% if files %} {% set accessModifier %}{% if param.publicAccess %}public{% else %}internal{% endif %}{% endset %} import Foundation // swiftlint:disable superfluous_disable_command // swiftlint:disable file_length // MARK: - Plist Files {% macro fileBlock file %} {% call documentBlock file file.document %} {% endmacro %} {% macro documentBlock file document %} {% set rootType %}{% call typeBlock document.metadata %}{% endset %} {% if document.metadata.type == "Array" %} {{accessModifier}} static let items: {{rootType}} = arrayFromPlist(at: "{% call transformPath file.path %}") {% elif document.metadata.type == "Dictionary" %} private static let _document = PlistDocument(path: "{% call transformPath file.path %}") {% for key,value in document.metadata.properties %} {{accessModifier}} {% call propertyBlock key value %} {% endfor %} {% else %} // Unsupported root type `{{rootType}}` {% endif %} {% endmacro %} {% macro typeBlock metadata %}{% filter removeNewlines:"leading" %} {% if metadata.type == "Array" %} [{% call typeBlock metadata.element %}] {% elif metadata.type == "Dictionary" %} [String: Any] {% else %} {{metadata.type}} {% endif %} {% endfilter %}{% endmacro %} {% macro propertyBlock key metadata %}{% filter removeNewlines:"leading" %} {% set propertyName %}{{key|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}}{% endset %} {% set propertyType %}{% call typeBlock metadata %}{% endset %} static let {{propertyName}}: {{propertyType}} = _document["{{key}}"] {% endfilter %}{% endmacro %} {% macro transformPath path %}{% filter removeNewlines %} {% if param.preservePath %} {{path}} {% else %} {{path|basename}} {% endif %} {% endfilter %}{% endmacro %} // swiftlint:disable identifier_name line_length type_body_length @objcMembers {{accessModifier}} class {{param.className|default:"PlistFiles"}}: NSObject { {% if files.count > 1 or param.forceFileNameEnum %} {% for file in files %} {{accessModifier}} class {{file.name|swiftIdentifier:"pretty"|escapeReservedKeywords}} { {% filter indent:2 %}{% call fileBlock file %}{% endfilter %} } {% endfor %} {% else %} {% call fileBlock files.first %} {% endif %} } // swiftlint:enable identifier_name line_length type_body_length // MARK: - Implementation Details private func arrayFromPlist(at path: String) -> [T] { {% if param.lookupFunction %} guard let url = {{param.lookupFunction}}(path), {% else %} guard let url = {{param.bundle|default:"BundleToken.bundle"}}.url(forResource: path, withExtension: nil), {% endif %} let data = NSArray(contentsOf: url) as? [T] else { fatalError("Unable to load PLIST at path: \(path)") } return data } private struct PlistDocument { let data: [String: Any] init(path: String) { {% if param.lookupFunction %} guard let url = {{param.lookupFunction}}(path), {% else %} guard let url = {{param.bundle|default:"BundleToken.bundle"}}.url(forResource: path, withExtension: nil), {% endif %} let data = NSDictionary(contentsOf: url) as? [String: Any] else { fatalError("Unable to load PLIST at path: \(path)") } self.data = data } subscript(key: String) -> T { guard let result = data[key] as? T else { fatalError("Property '\(key)' is not of type \(T.self)") } return result } } {% if not param.bundle and not param.lookupFunction %} // swiftlint:disable convenience_type private final class BundleToken { static let bundle: Bundle = { #if SWIFT_PACKAGE return Bundle.module #else return Bundle(for: BundleToken.self) #endif }() } // swiftlint:enable convenience_type {% endif %} {% else %} // No files found {% endif %}