add swiftgen
This commit is contained in:
parent
a808af8057
commit
f9de9e3800
|
@ -0,0 +1,42 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>BuildMachineOSBuild</key>
|
||||||
|
<string></string>
|
||||||
|
<key>CFBundleDevelopmentRegion</key>
|
||||||
|
<string>en</string>
|
||||||
|
<key>CFBundleExecutable</key>
|
||||||
|
<string>SwiftGen_SwiftGenCLI</string>
|
||||||
|
<key>CFBundleIdentifier</key>
|
||||||
|
<string>SwiftGen.SwiftGenCLI.resources</string>
|
||||||
|
<key>CFBundleInfoDictionaryVersion</key>
|
||||||
|
<string>6.0</string>
|
||||||
|
<key>CFBundleName</key>
|
||||||
|
<string>SwiftGen_SwiftGenCLI</string>
|
||||||
|
<key>CFBundlePackageType</key>
|
||||||
|
<string>BNDL</string>
|
||||||
|
<key>CFBundleSupportedPlatforms</key>
|
||||||
|
<array>
|
||||||
|
<string>MacOSX</string>
|
||||||
|
</array>
|
||||||
|
<key>DTCompiler</key>
|
||||||
|
<string>com.apple.compilers.llvm.clang.1_0</string>
|
||||||
|
<key>DTPlatformBuild</key>
|
||||||
|
<string>13A233</string>
|
||||||
|
<key>DTPlatformName</key>
|
||||||
|
<string>macosx</string>
|
||||||
|
<key>DTPlatformVersion</key>
|
||||||
|
<string>11.3</string>
|
||||||
|
<key>DTSDKBuild</key>
|
||||||
|
<string>20E214</string>
|
||||||
|
<key>DTSDKName</key>
|
||||||
|
<string>macosx11.3</string>
|
||||||
|
<key>DTXcode</key>
|
||||||
|
<string>1300</string>
|
||||||
|
<key>DTXcodeBuild</key>
|
||||||
|
<string>13A233</string>
|
||||||
|
<key>LSMinimumSystemVersion</key>
|
||||||
|
<string>10.11</string>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
|
@ -0,0 +1,43 @@
|
||||||
|
// swiftlint:disable all
|
||||||
|
// Generated using SwiftGen — https://github.com/SwiftGen/SwiftGen
|
||||||
|
|
||||||
|
{% if palettes %}
|
||||||
|
{% set enumName %}{{param.enumName|default:"ColorName"}}{% endset %}
|
||||||
|
{% set accessModifier %}{% if param.publicAccess %}public{% else %}internal{% endif %}{% endset %}
|
||||||
|
#if os(macOS)
|
||||||
|
import AppKit
|
||||||
|
{% if enumName != 'NSColor' %}{{accessModifier}} enum {{enumName}} { }{% endif %}
|
||||||
|
#elseif os(iOS) || os(tvOS) || os(watchOS)
|
||||||
|
import UIKit
|
||||||
|
{% if enumName != 'UIColor' %}{{accessModifier}} enum {{enumName}} { }{% endif %}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// swiftlint:disable superfluous_disable_command
|
||||||
|
// swiftlint:disable file_length
|
||||||
|
|
||||||
|
// MARK: - Colors
|
||||||
|
|
||||||
|
// swiftlint:disable identifier_name line_length type_body_length
|
||||||
|
{{accessModifier}} extension {{enumName}} {
|
||||||
|
{% macro h2f hex %}{{hex|hexToInt|int255toFloat}}{% endmacro %}
|
||||||
|
{% macro enumBlock colors accessPrefix %}
|
||||||
|
{% for color in colors %}
|
||||||
|
/// 0x{{color.red}}{{color.green}}{{color.blue}}{{color.alpha}} (r: {{color.red|hexToInt}}, g: {{color.green|hexToInt}}, b: {{color.blue|hexToInt}}, a: {{color.alpha|hexToInt}})
|
||||||
|
{{accessPrefix}}static let {{color.name|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}} = #colorLiteral(red: {% call h2f color.red %}, green: {% call h2f color.green %}, blue: {% call h2f color.blue %}, alpha: {% call h2f color.alpha %})
|
||||||
|
{% endfor %}
|
||||||
|
{% endmacro %}
|
||||||
|
{% if palettes.count > 1 or param.forceFileNameEnum %}
|
||||||
|
{% set accessPrefix %}{{accessModifier}} {% endset %}
|
||||||
|
{% for palette in palettes %}
|
||||||
|
enum {{palette.name|swiftIdentifier:"pretty"|escapeReservedKeywords}} {
|
||||||
|
{% filter indent:2 %}{% call enumBlock palette.colors accessPrefix %}{% endfilter %}
|
||||||
|
}
|
||||||
|
{% endfor %}
|
||||||
|
{% else %}
|
||||||
|
{% call enumBlock palettes.first.colors "" %}
|
||||||
|
{% endif %}
|
||||||
|
}
|
||||||
|
// swiftlint:enable identifier_name line_length type_body_length
|
||||||
|
{% else %}
|
||||||
|
// No color found
|
||||||
|
{% endif %}
|
|
@ -0,0 +1,43 @@
|
||||||
|
// swiftlint:disable all
|
||||||
|
// Generated using SwiftGen — https://github.com/SwiftGen/SwiftGen
|
||||||
|
|
||||||
|
{% if palettes %}
|
||||||
|
{% set enumName %}{{param.enumName|default:"ColorName"}}{% endset %}
|
||||||
|
{% set accessModifier %}{% if param.publicAccess %}public{% else %}internal{% endif %}{% endset %}
|
||||||
|
#if os(macOS)
|
||||||
|
import AppKit
|
||||||
|
{% if enumName != 'NSColor' %}{{accessModifier}} enum {{enumName}} { }{% endif %}
|
||||||
|
#elseif os(iOS) || os(tvOS) || os(watchOS)
|
||||||
|
import UIKit
|
||||||
|
{% if enumName != 'UIColor' %}{{accessModifier}} enum {{enumName}} { }{% endif %}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// swiftlint:disable superfluous_disable_command
|
||||||
|
// swiftlint:disable file_length
|
||||||
|
|
||||||
|
// MARK: - Colors
|
||||||
|
|
||||||
|
// swiftlint:disable identifier_name line_length type_body_length
|
||||||
|
{{accessModifier}} extension {{enumName}} {
|
||||||
|
{% macro h2f hex %}{{hex|hexToInt|int255toFloat}}{% endmacro %}
|
||||||
|
{% macro enumBlock colors accessPrefix %}
|
||||||
|
{% for color in colors %}
|
||||||
|
/// 0x{{color.red}}{{color.green}}{{color.blue}}{{color.alpha}} (r: {{color.red|hexToInt}}, g: {{color.green|hexToInt}}, b: {{color.blue|hexToInt}}, a: {{color.alpha|hexToInt}})
|
||||||
|
{{accessPrefix}}static let {{color.name|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}} = #colorLiteral(red: {% call h2f color.red %}, green: {% call h2f color.green %}, blue: {% call h2f color.blue %}, alpha: {% call h2f color.alpha %})
|
||||||
|
{% endfor %}
|
||||||
|
{% endmacro %}
|
||||||
|
{% if palettes.count > 1 or param.forceFileNameEnum %}
|
||||||
|
{% set accessPrefix %}{{accessModifier}} {% endset %}
|
||||||
|
{% for palette in palettes %}
|
||||||
|
enum {{palette.name|swiftIdentifier:"pretty"|escapeReservedKeywords}} {
|
||||||
|
{% filter indent:2 %}{% call enumBlock palette.colors accessPrefix %}{% endfilter %}
|
||||||
|
}
|
||||||
|
{% endfor %}
|
||||||
|
{% else %}
|
||||||
|
{% call enumBlock palettes.first.colors "" %}
|
||||||
|
{% endif %}
|
||||||
|
}
|
||||||
|
// swiftlint:enable identifier_name line_length type_body_length
|
||||||
|
{% else %}
|
||||||
|
// No color found
|
||||||
|
{% endif %}
|
|
@ -0,0 +1,84 @@
|
||||||
|
// swiftlint:disable all
|
||||||
|
// Generated using SwiftGen — https://github.com/SwiftGen/SwiftGen
|
||||||
|
|
||||||
|
{% if palettes %}
|
||||||
|
{% set colorAlias %}{{param.colorAliasName|default:"Color"}}{% endset %}
|
||||||
|
{% set accessModifier %}{% if param.publicAccess %}public{% else %}internal{% endif %}{% endset %}
|
||||||
|
#if os(macOS)
|
||||||
|
import AppKit.NSColor
|
||||||
|
{{accessModifier}} typealias {{colorAlias}} = NSColor
|
||||||
|
#elseif os(iOS) || os(tvOS) || os(watchOS)
|
||||||
|
import UIKit.UIColor
|
||||||
|
{{accessModifier}} typealias {{colorAlias}} = UIColor
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// swiftlint:disable superfluous_disable_command file_length implicit_return
|
||||||
|
|
||||||
|
// MARK: - Colors
|
||||||
|
|
||||||
|
// swiftlint:disable identifier_name line_length type_body_length
|
||||||
|
{% set enumName %}{{param.enumName|default:"ColorName"}}{% endset %}
|
||||||
|
{{accessModifier}} struct {{enumName}} {
|
||||||
|
{{accessModifier}} let rgbaValue: UInt32
|
||||||
|
{{accessModifier}} var color: {{colorAlias}} { return {{colorAlias}}(named: self) }
|
||||||
|
|
||||||
|
{% macro rgbaValue color %}0x{{color.red}}{{color.green}}{{color.blue}}{{color.alpha}}{% endmacro %}
|
||||||
|
{% macro enumBlock colors %}
|
||||||
|
{% for color in colors %}
|
||||||
|
/// <span style="display:block;width:3em;height:2em;border:1px solid black;background:#{{color.red}}{{color.green}}{{color.blue}}"></span>
|
||||||
|
/// Alpha: {{color.alpha|hexToInt|int255toFloat|percent}} <br/> (0x{{color.red}}{{color.green}}{{color.blue}}{{color.alpha}})
|
||||||
|
{{accessModifier}} static let {{color.name|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}} = {{enumName}}(rgbaValue: {% call rgbaValue color %})
|
||||||
|
{% endfor %}
|
||||||
|
{% endmacro %}
|
||||||
|
{% if palettes.count > 1 or param.forceFileNameEnum %}
|
||||||
|
{% for palette in palettes %}
|
||||||
|
{{accessModifier}} enum {{palette.name|swiftIdentifier:"pretty"|escapeReservedKeywords}} {
|
||||||
|
{% filter indent:2 %}{% call enumBlock palette.colors %}{% endfilter %}
|
||||||
|
}
|
||||||
|
{% endfor %}
|
||||||
|
{% else %}
|
||||||
|
{% call enumBlock palettes.first.colors %}
|
||||||
|
{% endif %}
|
||||||
|
}
|
||||||
|
// swiftlint:enable identifier_name line_length type_body_length
|
||||||
|
|
||||||
|
// MARK: - Implementation Details
|
||||||
|
|
||||||
|
internal extension {{colorAlias}} {
|
||||||
|
convenience init(rgbaValue: UInt32) {
|
||||||
|
let components = RGBAComponents(rgbaValue: rgbaValue).normalized
|
||||||
|
self.init(red: components[0], green: components[1], blue: components[2], alpha: components[3])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private struct RGBAComponents {
|
||||||
|
let rgbaValue: UInt32
|
||||||
|
|
||||||
|
private var shifts: [UInt32] {
|
||||||
|
[
|
||||||
|
rgbaValue >> 24, // red
|
||||||
|
rgbaValue >> 16, // green
|
||||||
|
rgbaValue >> 8, // blue
|
||||||
|
rgbaValue // alpha
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
private var components: [CGFloat] {
|
||||||
|
shifts.map {
|
||||||
|
CGFloat($0 & 0xff)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var normalized: [CGFloat] {
|
||||||
|
components.map { $0 / 255.0 }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
{{accessModifier}} extension {{colorAlias}} {
|
||||||
|
convenience init(named color: {{enumName}}) {
|
||||||
|
self.init(rgbaValue: color.rgbaValue)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
{% else %}
|
||||||
|
// No color found
|
||||||
|
{% endif %}
|
|
@ -0,0 +1,84 @@
|
||||||
|
// swiftlint:disable all
|
||||||
|
// Generated using SwiftGen — https://github.com/SwiftGen/SwiftGen
|
||||||
|
|
||||||
|
{% if palettes %}
|
||||||
|
{% set colorAlias %}{{param.colorAliasName|default:"Color"}}{% endset %}
|
||||||
|
{% set accessModifier %}{% if param.publicAccess %}public{% else %}internal{% endif %}{% endset %}
|
||||||
|
#if os(macOS)
|
||||||
|
import AppKit.NSColor
|
||||||
|
{{accessModifier}} typealias {{colorAlias}} = NSColor
|
||||||
|
#elseif os(iOS) || os(tvOS) || os(watchOS)
|
||||||
|
import UIKit.UIColor
|
||||||
|
{{accessModifier}} typealias {{colorAlias}} = UIColor
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// swiftlint:disable superfluous_disable_command file_length implicit_return
|
||||||
|
|
||||||
|
// MARK: - Colors
|
||||||
|
|
||||||
|
// swiftlint:disable identifier_name line_length type_body_length
|
||||||
|
{% set enumName %}{{param.enumName|default:"ColorName"}}{% endset %}
|
||||||
|
{{accessModifier}} struct {{enumName}} {
|
||||||
|
{{accessModifier}} let rgbaValue: UInt32
|
||||||
|
{{accessModifier}} var color: {{colorAlias}} { return {{colorAlias}}(named: self) }
|
||||||
|
|
||||||
|
{% macro rgbaValue color %}0x{{color.red}}{{color.green}}{{color.blue}}{{color.alpha}}{% endmacro %}
|
||||||
|
{% macro enumBlock colors %}
|
||||||
|
{% for color in colors %}
|
||||||
|
/// <span style="display:block;width:3em;height:2em;border:1px solid black;background:#{{color.red}}{{color.green}}{{color.blue}}"></span>
|
||||||
|
/// Alpha: {{color.alpha|hexToInt|int255toFloat|percent}} <br/> (0x{{color.red}}{{color.green}}{{color.blue}}{{color.alpha}})
|
||||||
|
{{accessModifier}} static let {{color.name|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}} = {{enumName}}(rgbaValue: {% call rgbaValue color %})
|
||||||
|
{% endfor %}
|
||||||
|
{% endmacro %}
|
||||||
|
{% if palettes.count > 1 or param.forceFileNameEnum %}
|
||||||
|
{% for palette in palettes %}
|
||||||
|
{{accessModifier}} enum {{palette.name|swiftIdentifier:"pretty"|escapeReservedKeywords}} {
|
||||||
|
{% filter indent:2 %}{% call enumBlock palette.colors %}{% endfilter %}
|
||||||
|
}
|
||||||
|
{% endfor %}
|
||||||
|
{% else %}
|
||||||
|
{% call enumBlock palettes.first.colors %}
|
||||||
|
{% endif %}
|
||||||
|
}
|
||||||
|
// swiftlint:enable identifier_name line_length type_body_length
|
||||||
|
|
||||||
|
// MARK: - Implementation Details
|
||||||
|
|
||||||
|
internal extension {{colorAlias}} {
|
||||||
|
convenience init(rgbaValue: UInt32) {
|
||||||
|
let components = RGBAComponents(rgbaValue: rgbaValue).normalized
|
||||||
|
self.init(red: components[0], green: components[1], blue: components[2], alpha: components[3])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private struct RGBAComponents {
|
||||||
|
let rgbaValue: UInt32
|
||||||
|
|
||||||
|
private var shifts: [UInt32] {
|
||||||
|
[
|
||||||
|
rgbaValue >> 24, // red
|
||||||
|
rgbaValue >> 16, // green
|
||||||
|
rgbaValue >> 8, // blue
|
||||||
|
rgbaValue // alpha
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
private var components: [CGFloat] {
|
||||||
|
shifts.map {
|
||||||
|
CGFloat($0 & 0xff)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var normalized: [CGFloat] {
|
||||||
|
components.map { $0 / 255.0 }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
{{accessModifier}} extension {{colorAlias}} {
|
||||||
|
convenience init(named color: {{enumName}}) {
|
||||||
|
self.init(rgbaValue: color.rgbaValue)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
{% else %}
|
||||||
|
// No color found
|
||||||
|
{% endif %}
|
|
@ -0,0 +1,211 @@
|
||||||
|
// swiftlint:disable all
|
||||||
|
// Generated using SwiftGen — https://github.com/SwiftGen/SwiftGen
|
||||||
|
|
||||||
|
// swiftlint:disable superfluous_disable_command implicit_return
|
||||||
|
// swiftlint:disable sorted_imports
|
||||||
|
import CoreData
|
||||||
|
import Foundation
|
||||||
|
{% for import in param.extraImports %}
|
||||||
|
import {{ import }}
|
||||||
|
{% empty %}
|
||||||
|
{# If extraImports is a single String instead of an array, `for` considers it empty but we still have to check if there's a single String value #}
|
||||||
|
{% if param.extraImports %}import {{ param.extraImports }}{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
// swiftlint:disable attributes file_length vertical_whitespace_closing_braces
|
||||||
|
// swiftlint:disable identifier_name line_length type_body_length
|
||||||
|
{% set accessModifier %}{% if param.publicAccess %}public{% else %}internal{% endif %}{% endset %}
|
||||||
|
|
||||||
|
{% for model in models %}
|
||||||
|
{% for name, entity in model.entities %}
|
||||||
|
{% set superclass %}{{ model.entities[entity.superEntity].className|default:"NSManagedObject" }}{% endset %}
|
||||||
|
{% set entityClassName %}{{ entity.className|default:"NSManagedObject" }}{% endset %}
|
||||||
|
// MARK: - {{ entity.name }}
|
||||||
|
|
||||||
|
{% if not entity.shouldGenerateCode %}
|
||||||
|
// Note: '{{ entity.name }}' has codegen enabled for Xcode, skipping code generation.
|
||||||
|
|
||||||
|
{% elif entityClassName|contains:"." %}
|
||||||
|
// Warning: '{{ entityClassName }}' cannot be a valid type name, skipping code generation.
|
||||||
|
|
||||||
|
{% else %}
|
||||||
|
{% if param.generateObjcName %}
|
||||||
|
@objc({{ entityClassName }})
|
||||||
|
{% endif %}
|
||||||
|
{{ accessModifier }} class {{ entityClassName }}: {{ superclass }} {
|
||||||
|
{% set override %}{% if superclass != "NSManagedObject" %}override {% endif %}{% endset %}
|
||||||
|
{{ override }}{{ accessModifier }} class var entityName: String {
|
||||||
|
return "{{ entity.name }}"
|
||||||
|
}
|
||||||
|
|
||||||
|
{{ override }}{{ accessModifier }} class func entity(in managedObjectContext: NSManagedObjectContext) -> NSEntityDescription? {
|
||||||
|
return NSEntityDescription.entity(forEntityName: entityName, in: managedObjectContext)
|
||||||
|
}
|
||||||
|
|
||||||
|
@available(*, deprecated, renamed: "makeFetchRequest", message: "To avoid collisions with the less concrete method in `NSManagedObject`, please use `makeFetchRequest()` instead.")
|
||||||
|
@nonobjc {{ accessModifier }} class func fetchRequest() -> NSFetchRequest<{{ entityClassName }}> {
|
||||||
|
return NSFetchRequest<{{ entityClassName }}>(entityName: entityName)
|
||||||
|
}
|
||||||
|
|
||||||
|
@nonobjc {{ accessModifier }} class func makeFetchRequest() -> NSFetchRequest<{{ entityClassName }}> {
|
||||||
|
return NSFetchRequest<{{ entityClassName }}>(entityName: entityName)
|
||||||
|
}
|
||||||
|
|
||||||
|
// swiftlint:disable discouraged_optional_boolean discouraged_optional_collection
|
||||||
|
{% for attribute in entity.attributes %}
|
||||||
|
{% if attribute.userInfo.RawType %}
|
||||||
|
{% set rawType attribute.userInfo.RawType %}
|
||||||
|
{% set unwrapOptional attribute.userInfo.unwrapOptional %}
|
||||||
|
{{ accessModifier }} var {{ attribute.name }}: {{ rawType }}{% if not unwrapOptional %}?{% endif %} {
|
||||||
|
get {
|
||||||
|
let key = "{{ attribute.name }}"
|
||||||
|
willAccessValue(forKey: key)
|
||||||
|
defer { didAccessValue(forKey: key) }
|
||||||
|
|
||||||
|
{% if unwrapOptional %}
|
||||||
|
guard let value = primitiveValue(forKey: key) as? {{ rawType }}.RawValue,
|
||||||
|
let result = {{ rawType }}(rawValue: value) else {
|
||||||
|
fatalError("Could not convert value for key '\(key)' to type '{{ rawType }}'")
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
{% else %}
|
||||||
|
guard let value = primitiveValue(forKey: key) as? {{ rawType }}.RawValue else {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return {{ rawType }}(rawValue: value)
|
||||||
|
{% endif %}
|
||||||
|
}
|
||||||
|
set {
|
||||||
|
let key = "{{ attribute.name }}"
|
||||||
|
willChangeValue(forKey: key)
|
||||||
|
defer { didChangeValue(forKey: key) }
|
||||||
|
|
||||||
|
setPrimitiveValue(newValue{% if not unwrapOptional %}?{% endif %}.rawValue, forKey: key)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
{% elif attribute.usesScalarValueType and attribute.isOptional %}
|
||||||
|
{{ accessModifier }} var {{ attribute.name }}: {{ attribute.typeName }}? {
|
||||||
|
get {
|
||||||
|
let key = "{{ attribute.name }}"
|
||||||
|
willAccessValue(forKey: key)
|
||||||
|
defer { didAccessValue(forKey: key) }
|
||||||
|
|
||||||
|
return primitiveValue(forKey: key) as? {{ attribute.typeName }}
|
||||||
|
}
|
||||||
|
set {
|
||||||
|
let key = "{{ attribute.name }}"
|
||||||
|
willChangeValue(forKey: key)
|
||||||
|
defer { didChangeValue(forKey: key) }
|
||||||
|
|
||||||
|
setPrimitiveValue(newValue, forKey: key)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
{% else %}
|
||||||
|
@NSManaged {{ accessModifier }} var {{ attribute.name }}: {{ attribute.typeName }}{% if attribute.isOptional %}?{% endif %}
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
{% for relationship in entity.relationships %}
|
||||||
|
{% if relationship.isToMany %}
|
||||||
|
@NSManaged {{ accessModifier }} var {{ relationship.name }}: {% if relationship.isOrdered %}NSOrderedSet{% else %}Set<{{ model.entities[relationship.destinationEntity].className|default:"NSManagedObject" }}>{% endif %}{% if relationship.isOptional %}?{% endif %}
|
||||||
|
{% else %}
|
||||||
|
@NSManaged {{ accessModifier }} var {{ relationship.name }}: {{ model.entities[relationship.destinationEntity].className|default:"NSManagedObject" }}{% if relationship.isOptional %}?{% endif %}
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
{% for fetchedProperty in entity.fetchedProperties %}
|
||||||
|
@NSManaged {{ accessModifier }} var {{ fetchedProperty.name }}: [{{ fetchedProperty.fetchRequest.entity }}]
|
||||||
|
{% endfor %}
|
||||||
|
// swiftlint:enable discouraged_optional_boolean discouraged_optional_collection
|
||||||
|
}
|
||||||
|
|
||||||
|
{% for relationship in entity.relationships where relationship.isToMany %}
|
||||||
|
{% set destinationEntityClassName %}{{ model.entities[relationship.destinationEntity].className|default:"NSManagedObject" }}{% endset %}
|
||||||
|
{% set collectionClassName %}{% if relationship.isOrdered %}NSOrderedSet{% else %}Set<{{ destinationEntityClassName }}>{% endif %}{% endset %}
|
||||||
|
{% set relationshipName %}{{ relationship.name | upperFirstLetter }}{% endset %}
|
||||||
|
// MARK: Relationship {{ relationshipName }}
|
||||||
|
|
||||||
|
extension {{ entityClassName }} {
|
||||||
|
{% if relationship.isOrdered %}
|
||||||
|
@objc(insertObject:in{{ relationshipName }}AtIndex:)
|
||||||
|
@NSManaged public func insertInto{{ relationshipName }}(_ value: {{ destinationEntityClassName }}, at idx: Int)
|
||||||
|
|
||||||
|
@objc(removeObjectFrom{{ relationshipName }}AtIndex:)
|
||||||
|
@NSManaged public func removeFrom{{ relationshipName }}(at idx: Int)
|
||||||
|
|
||||||
|
@objc(insert{{ relationshipName }}:atIndexes:)
|
||||||
|
@NSManaged public func insertInto{{ relationshipName }}(_ values: [{{ destinationEntityClassName }}], at indexes: NSIndexSet)
|
||||||
|
|
||||||
|
@objc(remove{{ relationshipName }}AtIndexes:)
|
||||||
|
@NSManaged public func removeFrom{{ relationshipName }}(at indexes: NSIndexSet)
|
||||||
|
|
||||||
|
@objc(replaceObjectIn{{ relationshipName }}AtIndex:withObject:)
|
||||||
|
@NSManaged public func replace{{ relationshipName }}(at idx: Int, with value: {{ destinationEntityClassName }})
|
||||||
|
|
||||||
|
@objc(replace{{ relationshipName }}AtIndexes:with{{ relationshipName }}:)
|
||||||
|
@NSManaged public func replace{{ relationshipName }}(at indexes: NSIndexSet, with values: [{{ destinationEntityClassName }}])
|
||||||
|
|
||||||
|
{% endif %}
|
||||||
|
@objc(add{{ relationshipName }}Object:)
|
||||||
|
@NSManaged public func addTo{{ relationshipName }}(_ value: {{ destinationEntityClassName }})
|
||||||
|
|
||||||
|
@objc(remove{{ relationshipName }}Object:)
|
||||||
|
@NSManaged public func removeFrom{{ relationshipName }}(_ value: {{ destinationEntityClassName }})
|
||||||
|
|
||||||
|
@objc(add{{ relationshipName }}:)
|
||||||
|
@NSManaged public func addTo{{ relationshipName }}(_ values: {{ collectionClassName }})
|
||||||
|
|
||||||
|
@objc(remove{{ relationshipName }}:)
|
||||||
|
@NSManaged public func removeFrom{{ relationshipName }}(_ values: {{ collectionClassName }})
|
||||||
|
}
|
||||||
|
|
||||||
|
{% endfor %}
|
||||||
|
{% if model.fetchRequests[entity.name].count > 0 %}
|
||||||
|
// MARK: Fetch Requests
|
||||||
|
|
||||||
|
extension {{ entityClassName }} {
|
||||||
|
{% for fetchRequest in model.fetchRequests[entity.name] %}
|
||||||
|
{% set resultTypeName %}{% filter removeNewlines:"leading" %}
|
||||||
|
{% if fetchRequest.resultType == "Object" %}
|
||||||
|
{{ entityClassName }}
|
||||||
|
{% elif fetchRequest.resultType == "Object ID" %}
|
||||||
|
NSManagedObjectID
|
||||||
|
{% elif fetchRequest.resultType == "Dictionary" %}
|
||||||
|
[String: Any]
|
||||||
|
{% endif %}
|
||||||
|
{% endfilter %}{% endset %}
|
||||||
|
class func fetch{{ fetchRequest.name | upperFirstLetter }}({% filter removeNewlines:"leading" %}
|
||||||
|
managedObjectContext: NSManagedObjectContext
|
||||||
|
{% for variableName, variableType in fetchRequest.substitutionVariables %}
|
||||||
|
, {{ variableName | lowerFirstWord }}: {{ variableType }}
|
||||||
|
{% endfor %}
|
||||||
|
{% endfilter %}) throws -> [{{ resultTypeName }}] {
|
||||||
|
guard let persistentStoreCoordinator = managedObjectContext.persistentStoreCoordinator else {
|
||||||
|
fatalError("Managed object context has no persistent store coordinator for getting fetch request templates")
|
||||||
|
}
|
||||||
|
let model = persistentStoreCoordinator.managedObjectModel
|
||||||
|
let substitutionVariables: [String: Any] = [
|
||||||
|
{% for variableName, variableType in fetchRequest.substitutionVariables %}
|
||||||
|
"{{ variableName }}": {{ variableName | lowerFirstWord }}{{ "," if not forloop.last }}
|
||||||
|
{% empty %}
|
||||||
|
:
|
||||||
|
{% endfor %}
|
||||||
|
]
|
||||||
|
|
||||||
|
guard let fetchRequest = model.fetchRequestFromTemplate(withName: "{{ fetchRequest.name }}", substitutionVariables: substitutionVariables) else {
|
||||||
|
fatalError("No fetch request template named '{{ fetchRequest.name }}' found.")
|
||||||
|
}
|
||||||
|
|
||||||
|
guard let result = try managedObjectContext.fetch(fetchRequest) as? [{{ resultTypeName }}] else {
|
||||||
|
fatalError("Unable to cast fetch result to correct result type.")
|
||||||
|
}
|
||||||
|
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
{% endfor %}
|
||||||
|
}
|
||||||
|
|
||||||
|
{% endif %}
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
{% endfor %}
|
||||||
|
// swiftlint:enable identifier_name line_length type_body_length
|
|
@ -0,0 +1,211 @@
|
||||||
|
// swiftlint:disable all
|
||||||
|
// Generated using SwiftGen — https://github.com/SwiftGen/SwiftGen
|
||||||
|
|
||||||
|
// swiftlint:disable superfluous_disable_command implicit_return
|
||||||
|
// swiftlint:disable sorted_imports
|
||||||
|
import CoreData
|
||||||
|
import Foundation
|
||||||
|
{% for import in param.extraImports %}
|
||||||
|
import {{ import }}
|
||||||
|
{% empty %}
|
||||||
|
{# If extraImports is a single String instead of an array, `for` considers it empty but we still have to check if there's a single String value #}
|
||||||
|
{% if param.extraImports %}import {{ param.extraImports }}{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
// swiftlint:disable attributes file_length vertical_whitespace_closing_braces
|
||||||
|
// swiftlint:disable identifier_name line_length type_body_length
|
||||||
|
{% set accessModifier %}{% if param.publicAccess %}public{% else %}internal{% endif %}{% endset %}
|
||||||
|
|
||||||
|
{% for model in models %}
|
||||||
|
{% for name, entity in model.entities %}
|
||||||
|
{% set superclass %}{{ model.entities[entity.superEntity].className|default:"NSManagedObject" }}{% endset %}
|
||||||
|
{% set entityClassName %}{{ entity.className|default:"NSManagedObject" }}{% endset %}
|
||||||
|
// MARK: - {{ entity.name }}
|
||||||
|
|
||||||
|
{% if not entity.shouldGenerateCode %}
|
||||||
|
// Note: '{{ entity.name }}' has codegen enabled for Xcode, skipping code generation.
|
||||||
|
|
||||||
|
{% elif entityClassName|contains:"." %}
|
||||||
|
// Warning: '{{ entityClassName }}' cannot be a valid type name, skipping code generation.
|
||||||
|
|
||||||
|
{% else %}
|
||||||
|
{% if param.generateObjcName %}
|
||||||
|
@objc({{ entityClassName }})
|
||||||
|
{% endif %}
|
||||||
|
{{ accessModifier }} class {{ entityClassName }}: {{ superclass }} {
|
||||||
|
{% set override %}{% if superclass != "NSManagedObject" %}override {% endif %}{% endset %}
|
||||||
|
{{ override }}{{ accessModifier }} class var entityName: String {
|
||||||
|
return "{{ entity.name }}"
|
||||||
|
}
|
||||||
|
|
||||||
|
{{ override }}{{ accessModifier }} class func entity(in managedObjectContext: NSManagedObjectContext) -> NSEntityDescription? {
|
||||||
|
return NSEntityDescription.entity(forEntityName: entityName, in: managedObjectContext)
|
||||||
|
}
|
||||||
|
|
||||||
|
@available(*, deprecated, renamed: "makeFetchRequest", message: "To avoid collisions with the less concrete method in `NSManagedObject`, please use `makeFetchRequest()` instead.")
|
||||||
|
@nonobjc {{ accessModifier }} class func fetchRequest() -> NSFetchRequest<{{ entityClassName }}> {
|
||||||
|
return NSFetchRequest<{{ entityClassName }}>(entityName: entityName)
|
||||||
|
}
|
||||||
|
|
||||||
|
@nonobjc {{ accessModifier }} class func makeFetchRequest() -> NSFetchRequest<{{ entityClassName }}> {
|
||||||
|
return NSFetchRequest<{{ entityClassName }}>(entityName: entityName)
|
||||||
|
}
|
||||||
|
|
||||||
|
// swiftlint:disable discouraged_optional_boolean discouraged_optional_collection
|
||||||
|
{% for attribute in entity.attributes %}
|
||||||
|
{% if attribute.userInfo.RawType %}
|
||||||
|
{% set rawType attribute.userInfo.RawType %}
|
||||||
|
{% set unwrapOptional attribute.userInfo.unwrapOptional %}
|
||||||
|
{{ accessModifier }} var {{ attribute.name }}: {{ rawType }}{% if not unwrapOptional %}?{% endif %} {
|
||||||
|
get {
|
||||||
|
let key = "{{ attribute.name }}"
|
||||||
|
willAccessValue(forKey: key)
|
||||||
|
defer { didAccessValue(forKey: key) }
|
||||||
|
|
||||||
|
{% if unwrapOptional %}
|
||||||
|
guard let value = primitiveValue(forKey: key) as? {{ rawType }}.RawValue,
|
||||||
|
let result = {{ rawType }}(rawValue: value) else {
|
||||||
|
fatalError("Could not convert value for key '\(key)' to type '{{ rawType }}'")
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
{% else %}
|
||||||
|
guard let value = primitiveValue(forKey: key) as? {{ rawType }}.RawValue else {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return {{ rawType }}(rawValue: value)
|
||||||
|
{% endif %}
|
||||||
|
}
|
||||||
|
set {
|
||||||
|
let key = "{{ attribute.name }}"
|
||||||
|
willChangeValue(forKey: key)
|
||||||
|
defer { didChangeValue(forKey: key) }
|
||||||
|
|
||||||
|
setPrimitiveValue(newValue{% if not unwrapOptional %}?{% endif %}.rawValue, forKey: key)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
{% elif attribute.usesScalarValueType and attribute.isOptional %}
|
||||||
|
{{ accessModifier }} var {{ attribute.name }}: {{ attribute.typeName }}? {
|
||||||
|
get {
|
||||||
|
let key = "{{ attribute.name }}"
|
||||||
|
willAccessValue(forKey: key)
|
||||||
|
defer { didAccessValue(forKey: key) }
|
||||||
|
|
||||||
|
return primitiveValue(forKey: key) as? {{ attribute.typeName }}
|
||||||
|
}
|
||||||
|
set {
|
||||||
|
let key = "{{ attribute.name }}"
|
||||||
|
willChangeValue(forKey: key)
|
||||||
|
defer { didChangeValue(forKey: key) }
|
||||||
|
|
||||||
|
setPrimitiveValue(newValue, forKey: key)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
{% else %}
|
||||||
|
@NSManaged {{ accessModifier }} var {{ attribute.name }}: {{ attribute.typeName }}{% if attribute.isOptional %}?{% endif %}
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
{% for relationship in entity.relationships %}
|
||||||
|
{% if relationship.isToMany %}
|
||||||
|
@NSManaged {{ accessModifier }} var {{ relationship.name }}: {% if relationship.isOrdered %}NSOrderedSet{% else %}Set<{{ model.entities[relationship.destinationEntity].className|default:"NSManagedObject" }}>{% endif %}{% if relationship.isOptional %}?{% endif %}
|
||||||
|
{% else %}
|
||||||
|
@NSManaged {{ accessModifier }} var {{ relationship.name }}: {{ model.entities[relationship.destinationEntity].className|default:"NSManagedObject" }}{% if relationship.isOptional %}?{% endif %}
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
{% for fetchedProperty in entity.fetchedProperties %}
|
||||||
|
@NSManaged {{ accessModifier }} var {{ fetchedProperty.name }}: [{{ fetchedProperty.fetchRequest.entity }}]
|
||||||
|
{% endfor %}
|
||||||
|
// swiftlint:enable discouraged_optional_boolean discouraged_optional_collection
|
||||||
|
}
|
||||||
|
|
||||||
|
{% for relationship in entity.relationships where relationship.isToMany %}
|
||||||
|
{% set destinationEntityClassName %}{{ model.entities[relationship.destinationEntity].className|default:"NSManagedObject" }}{% endset %}
|
||||||
|
{% set collectionClassName %}{% if relationship.isOrdered %}NSOrderedSet{% else %}Set<{{ destinationEntityClassName }}>{% endif %}{% endset %}
|
||||||
|
{% set relationshipName %}{{ relationship.name | upperFirstLetter }}{% endset %}
|
||||||
|
// MARK: Relationship {{ relationshipName }}
|
||||||
|
|
||||||
|
extension {{ entityClassName }} {
|
||||||
|
{% if relationship.isOrdered %}
|
||||||
|
@objc(insertObject:in{{ relationshipName }}AtIndex:)
|
||||||
|
@NSManaged public func insertInto{{ relationshipName }}(_ value: {{ destinationEntityClassName }}, at idx: Int)
|
||||||
|
|
||||||
|
@objc(removeObjectFrom{{ relationshipName }}AtIndex:)
|
||||||
|
@NSManaged public func removeFrom{{ relationshipName }}(at idx: Int)
|
||||||
|
|
||||||
|
@objc(insert{{ relationshipName }}:atIndexes:)
|
||||||
|
@NSManaged public func insertInto{{ relationshipName }}(_ values: [{{ destinationEntityClassName }}], at indexes: NSIndexSet)
|
||||||
|
|
||||||
|
@objc(remove{{ relationshipName }}AtIndexes:)
|
||||||
|
@NSManaged public func removeFrom{{ relationshipName }}(at indexes: NSIndexSet)
|
||||||
|
|
||||||
|
@objc(replaceObjectIn{{ relationshipName }}AtIndex:withObject:)
|
||||||
|
@NSManaged public func replace{{ relationshipName }}(at idx: Int, with value: {{ destinationEntityClassName }})
|
||||||
|
|
||||||
|
@objc(replace{{ relationshipName }}AtIndexes:with{{ relationshipName }}:)
|
||||||
|
@NSManaged public func replace{{ relationshipName }}(at indexes: NSIndexSet, with values: [{{ destinationEntityClassName }}])
|
||||||
|
|
||||||
|
{% endif %}
|
||||||
|
@objc(add{{ relationshipName }}Object:)
|
||||||
|
@NSManaged public func addTo{{ relationshipName }}(_ value: {{ destinationEntityClassName }})
|
||||||
|
|
||||||
|
@objc(remove{{ relationshipName }}Object:)
|
||||||
|
@NSManaged public func removeFrom{{ relationshipName }}(_ value: {{ destinationEntityClassName }})
|
||||||
|
|
||||||
|
@objc(add{{ relationshipName }}:)
|
||||||
|
@NSManaged public func addTo{{ relationshipName }}(_ values: {{ collectionClassName }})
|
||||||
|
|
||||||
|
@objc(remove{{ relationshipName }}:)
|
||||||
|
@NSManaged public func removeFrom{{ relationshipName }}(_ values: {{ collectionClassName }})
|
||||||
|
}
|
||||||
|
|
||||||
|
{% endfor %}
|
||||||
|
{% if model.fetchRequests[entity.name].count > 0 %}
|
||||||
|
// MARK: Fetch Requests
|
||||||
|
|
||||||
|
extension {{ entityClassName }} {
|
||||||
|
{% for fetchRequest in model.fetchRequests[entity.name] %}
|
||||||
|
{% set resultTypeName %}{% filter removeNewlines:"leading" %}
|
||||||
|
{% if fetchRequest.resultType == "Object" %}
|
||||||
|
{{ entityClassName }}
|
||||||
|
{% elif fetchRequest.resultType == "Object ID" %}
|
||||||
|
NSManagedObjectID
|
||||||
|
{% elif fetchRequest.resultType == "Dictionary" %}
|
||||||
|
[String: Any]
|
||||||
|
{% endif %}
|
||||||
|
{% endfilter %}{% endset %}
|
||||||
|
class func fetch{{ fetchRequest.name | upperFirstLetter }}({% filter removeNewlines:"leading" %}
|
||||||
|
managedObjectContext: NSManagedObjectContext
|
||||||
|
{% for variableName, variableType in fetchRequest.substitutionVariables %}
|
||||||
|
, {{ variableName | lowerFirstWord }}: {{ variableType }}
|
||||||
|
{% endfor %}
|
||||||
|
{% endfilter %}) throws -> [{{ resultTypeName }}] {
|
||||||
|
guard let persistentStoreCoordinator = managedObjectContext.persistentStoreCoordinator else {
|
||||||
|
fatalError("Managed object context has no persistent store coordinator for getting fetch request templates")
|
||||||
|
}
|
||||||
|
let model = persistentStoreCoordinator.managedObjectModel
|
||||||
|
let substitutionVariables: [String: Any] = [
|
||||||
|
{% for variableName, variableType in fetchRequest.substitutionVariables %}
|
||||||
|
"{{ variableName }}": {{ variableName | lowerFirstWord }}{{ "," if not forloop.last }}
|
||||||
|
{% empty %}
|
||||||
|
:
|
||||||
|
{% endfor %}
|
||||||
|
]
|
||||||
|
|
||||||
|
guard let fetchRequest = model.fetchRequestFromTemplate(withName: "{{ fetchRequest.name }}", substitutionVariables: substitutionVariables) else {
|
||||||
|
fatalError("No fetch request template named '{{ fetchRequest.name }}' found.")
|
||||||
|
}
|
||||||
|
|
||||||
|
guard let result = try managedObjectContext.fetch(fetchRequest) as? [{{ resultTypeName }}] else {
|
||||||
|
fatalError("Unable to cast fetch result to correct result type.")
|
||||||
|
}
|
||||||
|
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
{% endfor %}
|
||||||
|
}
|
||||||
|
|
||||||
|
{% endif %}
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
{% endfor %}
|
||||||
|
// swiftlint:enable identifier_name line_length type_body_length
|
|
@ -0,0 +1,103 @@
|
||||||
|
// swiftlint:disable all
|
||||||
|
// Generated using SwiftGen — https://github.com/SwiftGen/SwiftGen
|
||||||
|
|
||||||
|
{% if groups.count > 0 %}
|
||||||
|
{% set enumName %}{{param.enumName|default:"Files"}}{% endset %}
|
||||||
|
{% set useExt %}{% if param.useExtension|default:"true" %}true{% endif %}{% endset %}
|
||||||
|
{% set accessModifier %}{% if param.publicAccess %}public{% else %}internal{% endif %}{% endset %}
|
||||||
|
{% set resourceType %}{{param.resourceTypeName|default:"File"}}{% endset %}
|
||||||
|
import Foundation
|
||||||
|
|
||||||
|
// swiftlint:disable superfluous_disable_command file_length line_length implicit_return
|
||||||
|
|
||||||
|
// MARK: - Files
|
||||||
|
|
||||||
|
{% macro groupBlock group %}
|
||||||
|
{% for file in group.files %}
|
||||||
|
{% call fileBlock file %}
|
||||||
|
{% endfor %}
|
||||||
|
{% for dir in group.directories %}
|
||||||
|
{% call dirBlock dir %}
|
||||||
|
{% endfor %}
|
||||||
|
{% endmacro %}
|
||||||
|
{% macro fileBlock file %}
|
||||||
|
/// {% if file.path and param.preservePath %}{{file.path}}/{% endif %}{{file.name}}{% if file.ext %}.{{file.ext}}{% endif %}
|
||||||
|
{% set identifier %}{{ file.name }}{% if useExt %}.{{ file.ext }}{% endif %}{% endset %}
|
||||||
|
{{accessModifier}} static let {{identifier|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}} = {{resourceType}}(name: "{{file.name}}", ext: {% if file.ext %}"{{file.ext}}"{% else %}nil{% endif %}, relativePath: "{{file.path if param.preservePath}}", mimeType: "{{file.mimeType}}")
|
||||||
|
{% endmacro %}
|
||||||
|
{% macro dirBlock directory %}
|
||||||
|
{% for file in directory.files %}
|
||||||
|
{% call fileBlock file %}
|
||||||
|
{% endfor %}
|
||||||
|
{% for dir in directory.directories %}
|
||||||
|
{% call dirBlock dir %}
|
||||||
|
{% endfor %}
|
||||||
|
{% endmacro %}
|
||||||
|
// swiftlint:disable explicit_type_interface identifier_name
|
||||||
|
// swiftlint:disable nesting type_body_length type_name vertical_whitespace_opening_braces
|
||||||
|
{{accessModifier}} enum {{enumName}} {
|
||||||
|
{% if groups.count > 1 or param.forceFileNameEnum %}
|
||||||
|
{% for group in groups %}
|
||||||
|
{{accessModifier}} enum {{group.name|swiftIdentifier:"pretty"|escapeReservedKeywords}} {
|
||||||
|
{% filter indent:2 %}{% call groupBlock group %}{% endfilter %}
|
||||||
|
}
|
||||||
|
{% endfor %}
|
||||||
|
{% else %}
|
||||||
|
{% call groupBlock groups.first %}
|
||||||
|
{% endif %}
|
||||||
|
}
|
||||||
|
// swiftlint:enable explicit_type_interface identifier_name
|
||||||
|
// swiftlint:enable nesting type_body_length type_name vertical_whitespace_opening_braces
|
||||||
|
|
||||||
|
// MARK: - Implementation Details
|
||||||
|
|
||||||
|
{{accessModifier}} struct {{resourceType}} {
|
||||||
|
{{accessModifier}} let name: String
|
||||||
|
{{accessModifier}} let ext: String?
|
||||||
|
{{accessModifier}} let relativePath: String
|
||||||
|
{{accessModifier}} let mimeType: String
|
||||||
|
|
||||||
|
{{accessModifier}} var url: URL {
|
||||||
|
return url(locale: nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
{{accessModifier}} func url(locale: Locale?) -> URL {
|
||||||
|
let bundle = {{param.bundle|default:"BundleToken.bundle"}}
|
||||||
|
let url = bundle.url(
|
||||||
|
forResource: name,
|
||||||
|
withExtension: ext,
|
||||||
|
subdirectory: relativePath,
|
||||||
|
localization: locale?.identifier
|
||||||
|
)
|
||||||
|
guard let result = url else {
|
||||||
|
let file = name + (ext.flatMap { ".\($0)" } ?? "")
|
||||||
|
fatalError("Could not locate file named \(file)")
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
{{accessModifier}} var path: String {
|
||||||
|
return path(locale: nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
{{accessModifier}} func path(locale: Locale?) -> String {
|
||||||
|
return url(locale: locale).path
|
||||||
|
}
|
||||||
|
}
|
||||||
|
{% if not param.bundle %}
|
||||||
|
|
||||||
|
// swiftlint:disable convenience_type explicit_type_interface
|
||||||
|
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 explicit_type_interface
|
||||||
|
{% endif %}
|
||||||
|
{% else %}
|
||||||
|
// No files found
|
||||||
|
{% endif %}
|
|
@ -0,0 +1,103 @@
|
||||||
|
// swiftlint:disable all
|
||||||
|
// Generated using SwiftGen — https://github.com/SwiftGen/SwiftGen
|
||||||
|
|
||||||
|
{% if groups.count > 0 %}
|
||||||
|
{% set enumName %}{{param.enumName|default:"Files"}}{% endset %}
|
||||||
|
{% set useExt %}{% if param.useExtension|default:"true" %}true{% endif %}{% endset %}
|
||||||
|
{% set accessModifier %}{% if param.publicAccess %}public{% else %}internal{% endif %}{% endset %}
|
||||||
|
{% set resourceType %}{{param.resourceTypeName|default:"File"}}{% endset %}
|
||||||
|
import Foundation
|
||||||
|
|
||||||
|
// swiftlint:disable superfluous_disable_command file_length line_length implicit_return
|
||||||
|
|
||||||
|
// MARK: - Files
|
||||||
|
|
||||||
|
{% macro groupBlock group %}
|
||||||
|
{% for file in group.files %}
|
||||||
|
{% call fileBlock file %}
|
||||||
|
{% endfor %}
|
||||||
|
{% for dir in group.directories %}
|
||||||
|
{% call dirBlock dir %}
|
||||||
|
{% endfor %}
|
||||||
|
{% endmacro %}
|
||||||
|
{% macro fileBlock file %}
|
||||||
|
/// {% if file.path and param.preservePath %}{{file.path}}/{% endif %}{{file.name}}{% if file.ext %}.{{file.ext}}{% endif %}
|
||||||
|
{% set identifier %}{{ file.name }}{% if useExt %}.{{ file.ext }}{% endif %}{% endset %}
|
||||||
|
{{accessModifier}} static let {{identifier|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}} = {{resourceType}}(name: "{{file.name}}", ext: {% if file.ext %}"{{file.ext}}"{% else %}nil{% endif %}, relativePath: "{{file.path if param.preservePath}}", mimeType: "{{file.mimeType}}")
|
||||||
|
{% endmacro %}
|
||||||
|
{% macro dirBlock directory %}
|
||||||
|
{% for file in directory.files %}
|
||||||
|
{% call fileBlock file %}
|
||||||
|
{% endfor %}
|
||||||
|
{% for dir in directory.directories %}
|
||||||
|
{% call dirBlock dir %}
|
||||||
|
{% endfor %}
|
||||||
|
{% endmacro %}
|
||||||
|
// swiftlint:disable explicit_type_interface identifier_name
|
||||||
|
// swiftlint:disable nesting type_body_length type_name vertical_whitespace_opening_braces
|
||||||
|
{{accessModifier}} enum {{enumName}} {
|
||||||
|
{% if groups.count > 1 or param.forceFileNameEnum %}
|
||||||
|
{% for group in groups %}
|
||||||
|
{{accessModifier}} enum {{group.name|swiftIdentifier:"pretty"|escapeReservedKeywords}} {
|
||||||
|
{% filter indent:2 %}{% call groupBlock group %}{% endfilter %}
|
||||||
|
}
|
||||||
|
{% endfor %}
|
||||||
|
{% else %}
|
||||||
|
{% call groupBlock groups.first %}
|
||||||
|
{% endif %}
|
||||||
|
}
|
||||||
|
// swiftlint:enable explicit_type_interface identifier_name
|
||||||
|
// swiftlint:enable nesting type_body_length type_name vertical_whitespace_opening_braces
|
||||||
|
|
||||||
|
// MARK: - Implementation Details
|
||||||
|
|
||||||
|
{{accessModifier}} struct {{resourceType}} {
|
||||||
|
{{accessModifier}} let name: String
|
||||||
|
{{accessModifier}} let ext: String?
|
||||||
|
{{accessModifier}} let relativePath: String
|
||||||
|
{{accessModifier}} let mimeType: String
|
||||||
|
|
||||||
|
{{accessModifier}} var url: URL {
|
||||||
|
return url(locale: nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
{{accessModifier}} func url(locale: Locale?) -> URL {
|
||||||
|
let bundle = {{param.bundle|default:"BundleToken.bundle"}}
|
||||||
|
let url = bundle.url(
|
||||||
|
forResource: name,
|
||||||
|
withExtension: ext,
|
||||||
|
subdirectory: relativePath,
|
||||||
|
localization: locale?.identifier
|
||||||
|
)
|
||||||
|
guard let result = url else {
|
||||||
|
let file = name + (ext.flatMap { ".\($0)" } ?? "")
|
||||||
|
fatalError("Could not locate file named \(file)")
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
{{accessModifier}} var path: String {
|
||||||
|
return path(locale: nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
{{accessModifier}} func path(locale: Locale?) -> String {
|
||||||
|
return url(locale: locale).path
|
||||||
|
}
|
||||||
|
}
|
||||||
|
{% if not param.bundle %}
|
||||||
|
|
||||||
|
// swiftlint:disable convenience_type explicit_type_interface
|
||||||
|
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 explicit_type_interface
|
||||||
|
{% endif %}
|
||||||
|
{% else %}
|
||||||
|
// No files found
|
||||||
|
{% endif %}
|
|
@ -0,0 +1,107 @@
|
||||||
|
// swiftlint:disable all
|
||||||
|
// Generated using SwiftGen — https://github.com/SwiftGen/SwiftGen
|
||||||
|
|
||||||
|
{% if groups.count > 0 %}
|
||||||
|
{% set enumName %}{{param.enumName|default:"Files"}}{% endset %}
|
||||||
|
{% set useExt %}{% if param.useExtension|default:"true" %}true{% endif %}{% endset %}
|
||||||
|
{% set accessModifier %}{% if param.publicAccess %}public{% else %}internal{% endif %}{% endset %}
|
||||||
|
{% set resourceType %}{{param.resourceTypeName|default:"File"}}{% endset %}
|
||||||
|
import Foundation
|
||||||
|
|
||||||
|
// swiftlint:disable superfluous_disable_command file_length line_length implicit_return
|
||||||
|
|
||||||
|
// MARK: - Files
|
||||||
|
|
||||||
|
{% macro groupBlock group %}
|
||||||
|
{% for file in group.files %}
|
||||||
|
{% call fileBlock file %}
|
||||||
|
{% endfor %}
|
||||||
|
{% for dir in group.directories %}
|
||||||
|
{% call dirBlock dir "" %}
|
||||||
|
{% endfor %}
|
||||||
|
{% endmacro %}
|
||||||
|
{% macro fileBlock file %}
|
||||||
|
/// {% if file.path and param.preservePath %}{{file.path}}/{% endif %}{{file.name}}{% if file.ext %}.{{file.ext}}{% endif %}
|
||||||
|
{% set identifier %}{{ file.name }}{% if useExt %}.{{ file.ext }}{% endif %}{% endset %}
|
||||||
|
{{accessModifier}} static let {{identifier|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}} = {{resourceType}}(name: "{{file.name}}", ext: {% if file.ext %}"{{file.ext}}"{% else %}nil{% endif %}, relativePath: "{{file.path if param.preservePath}}", mimeType: "{{file.mimeType}}")
|
||||||
|
{% endmacro %}
|
||||||
|
{% macro dirBlock directory parent %}
|
||||||
|
{% set fullDir %}{{parent}}{{directory.name}}/{% endset %}
|
||||||
|
/// {{ fullDir }}
|
||||||
|
{{accessModifier}} enum {{directory.name|swiftIdentifier:"pretty"|escapeReservedKeywords}} {
|
||||||
|
{% for file in directory.files %}
|
||||||
|
{% filter indent:2 %}{% call fileBlock file %}{% endfilter %}
|
||||||
|
{% endfor %}
|
||||||
|
{% for dir in directory.directories %}
|
||||||
|
{% filter indent:2 %}{% call dirBlock dir fullDir %}{% endfilter %}
|
||||||
|
{% endfor %}
|
||||||
|
}
|
||||||
|
{% endmacro %}
|
||||||
|
// swiftlint:disable explicit_type_interface identifier_name
|
||||||
|
// swiftlint:disable nesting type_body_length type_name vertical_whitespace_opening_braces
|
||||||
|
{{accessModifier}} enum {{enumName}} {
|
||||||
|
{% if groups.count > 1 or param.forceFileNameEnum %}
|
||||||
|
{% for group in groups %}
|
||||||
|
{{accessModifier}} enum {{group.name|swiftIdentifier:"pretty"|escapeReservedKeywords}} {
|
||||||
|
{% filter indent:2 %}{% call groupBlock group %}{% endfilter %}
|
||||||
|
}
|
||||||
|
{% endfor %}
|
||||||
|
{% else %}
|
||||||
|
{% call groupBlock groups.first %}
|
||||||
|
{% endif %}
|
||||||
|
}
|
||||||
|
// swiftlint:enable explicit_type_interface identifier_name
|
||||||
|
// swiftlint:enable nesting type_body_length type_name vertical_whitespace_opening_braces
|
||||||
|
|
||||||
|
// MARK: - Implementation Details
|
||||||
|
|
||||||
|
{{accessModifier}} struct {{resourceType}} {
|
||||||
|
{{accessModifier}} let name: String
|
||||||
|
{{accessModifier}} let ext: String?
|
||||||
|
{{accessModifier}} let relativePath: String
|
||||||
|
{{accessModifier}} let mimeType: String
|
||||||
|
|
||||||
|
{{accessModifier}} var url: URL {
|
||||||
|
return url(locale: nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
{{accessModifier}} func url(locale: Locale?) -> URL {
|
||||||
|
let bundle = {{param.bundle|default:"BundleToken.bundle"}}
|
||||||
|
let url = bundle.url(
|
||||||
|
forResource: name,
|
||||||
|
withExtension: ext,
|
||||||
|
subdirectory: relativePath,
|
||||||
|
localization: locale?.identifier
|
||||||
|
)
|
||||||
|
guard let result = url else {
|
||||||
|
let file = name + (ext.flatMap { ".\($0)" } ?? "")
|
||||||
|
fatalError("Could not locate file named \(file)")
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
{{accessModifier}} var path: String {
|
||||||
|
return path(locale: nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
{{accessModifier}} func path(locale: Locale?) -> String {
|
||||||
|
return url(locale: locale).path
|
||||||
|
}
|
||||||
|
}
|
||||||
|
{% if not param.bundle %}
|
||||||
|
|
||||||
|
// swiftlint:disable convenience_type explicit_type_interface
|
||||||
|
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 explicit_type_interface
|
||||||
|
{% endif %}
|
||||||
|
{% else %}
|
||||||
|
// No files found
|
||||||
|
{% endif %}
|
|
@ -0,0 +1,107 @@
|
||||||
|
// swiftlint:disable all
|
||||||
|
// Generated using SwiftGen — https://github.com/SwiftGen/SwiftGen
|
||||||
|
|
||||||
|
{% if groups.count > 0 %}
|
||||||
|
{% set enumName %}{{param.enumName|default:"Files"}}{% endset %}
|
||||||
|
{% set useExt %}{% if param.useExtension|default:"true" %}true{% endif %}{% endset %}
|
||||||
|
{% set accessModifier %}{% if param.publicAccess %}public{% else %}internal{% endif %}{% endset %}
|
||||||
|
{% set resourceType %}{{param.resourceTypeName|default:"File"}}{% endset %}
|
||||||
|
import Foundation
|
||||||
|
|
||||||
|
// swiftlint:disable superfluous_disable_command file_length line_length implicit_return
|
||||||
|
|
||||||
|
// MARK: - Files
|
||||||
|
|
||||||
|
{% macro groupBlock group %}
|
||||||
|
{% for file in group.files %}
|
||||||
|
{% call fileBlock file %}
|
||||||
|
{% endfor %}
|
||||||
|
{% for dir in group.directories %}
|
||||||
|
{% call dirBlock dir "" %}
|
||||||
|
{% endfor %}
|
||||||
|
{% endmacro %}
|
||||||
|
{% macro fileBlock file %}
|
||||||
|
/// {% if file.path and param.preservePath %}{{file.path}}/{% endif %}{{file.name}}{% if file.ext %}.{{file.ext}}{% endif %}
|
||||||
|
{% set identifier %}{{ file.name }}{% if useExt %}.{{ file.ext }}{% endif %}{% endset %}
|
||||||
|
{{accessModifier}} static let {{identifier|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}} = {{resourceType}}(name: "{{file.name}}", ext: {% if file.ext %}"{{file.ext}}"{% else %}nil{% endif %}, relativePath: "{{file.path if param.preservePath}}", mimeType: "{{file.mimeType}}")
|
||||||
|
{% endmacro %}
|
||||||
|
{% macro dirBlock directory parent %}
|
||||||
|
{% set fullDir %}{{parent}}{{directory.name}}/{% endset %}
|
||||||
|
/// {{ fullDir }}
|
||||||
|
{{accessModifier}} enum {{directory.name|swiftIdentifier:"pretty"|escapeReservedKeywords}} {
|
||||||
|
{% for file in directory.files %}
|
||||||
|
{% filter indent:2 %}{% call fileBlock file %}{% endfilter %}
|
||||||
|
{% endfor %}
|
||||||
|
{% for dir in directory.directories %}
|
||||||
|
{% filter indent:2 %}{% call dirBlock dir fullDir %}{% endfilter %}
|
||||||
|
{% endfor %}
|
||||||
|
}
|
||||||
|
{% endmacro %}
|
||||||
|
// swiftlint:disable explicit_type_interface identifier_name
|
||||||
|
// swiftlint:disable nesting type_body_length type_name vertical_whitespace_opening_braces
|
||||||
|
{{accessModifier}} enum {{enumName}} {
|
||||||
|
{% if groups.count > 1 or param.forceFileNameEnum %}
|
||||||
|
{% for group in groups %}
|
||||||
|
{{accessModifier}} enum {{group.name|swiftIdentifier:"pretty"|escapeReservedKeywords}} {
|
||||||
|
{% filter indent:2 %}{% call groupBlock group %}{% endfilter %}
|
||||||
|
}
|
||||||
|
{% endfor %}
|
||||||
|
{% else %}
|
||||||
|
{% call groupBlock groups.first %}
|
||||||
|
{% endif %}
|
||||||
|
}
|
||||||
|
// swiftlint:enable explicit_type_interface identifier_name
|
||||||
|
// swiftlint:enable nesting type_body_length type_name vertical_whitespace_opening_braces
|
||||||
|
|
||||||
|
// MARK: - Implementation Details
|
||||||
|
|
||||||
|
{{accessModifier}} struct {{resourceType}} {
|
||||||
|
{{accessModifier}} let name: String
|
||||||
|
{{accessModifier}} let ext: String?
|
||||||
|
{{accessModifier}} let relativePath: String
|
||||||
|
{{accessModifier}} let mimeType: String
|
||||||
|
|
||||||
|
{{accessModifier}} var url: URL {
|
||||||
|
return url(locale: nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
{{accessModifier}} func url(locale: Locale?) -> URL {
|
||||||
|
let bundle = {{param.bundle|default:"BundleToken.bundle"}}
|
||||||
|
let url = bundle.url(
|
||||||
|
forResource: name,
|
||||||
|
withExtension: ext,
|
||||||
|
subdirectory: relativePath,
|
||||||
|
localization: locale?.identifier
|
||||||
|
)
|
||||||
|
guard let result = url else {
|
||||||
|
let file = name + (ext.flatMap { ".\($0)" } ?? "")
|
||||||
|
fatalError("Could not locate file named \(file)")
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
{{accessModifier}} var path: String {
|
||||||
|
return path(locale: nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
{{accessModifier}} func path(locale: Locale?) -> String {
|
||||||
|
return url(locale: locale).path
|
||||||
|
}
|
||||||
|
}
|
||||||
|
{% if not param.bundle %}
|
||||||
|
|
||||||
|
// swiftlint:disable convenience_type explicit_type_interface
|
||||||
|
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 explicit_type_interface
|
||||||
|
{% endif %}
|
||||||
|
{% else %}
|
||||||
|
// No files found
|
||||||
|
{% endif %}
|
|
@ -0,0 +1,110 @@
|
||||||
|
// swiftlint:disable all
|
||||||
|
// Generated using SwiftGen — https://github.com/SwiftGen/SwiftGen
|
||||||
|
|
||||||
|
{% if families %}
|
||||||
|
{% set accessModifier %}{% if param.publicAccess %}public{% else %}internal{% endif %}{% endset %}
|
||||||
|
{% set fontType %}{{param.fontTypeName|default:"FontConvertible"}}{% endset %}
|
||||||
|
#if os(macOS)
|
||||||
|
import AppKit.NSFont
|
||||||
|
#elseif os(iOS) || os(tvOS) || os(watchOS)
|
||||||
|
import UIKit.UIFont
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Deprecated typealiases
|
||||||
|
@available(*, deprecated, renamed: "{{fontType}}.Font", message: "This typealias will be removed in SwiftGen 7.0")
|
||||||
|
{{accessModifier}} typealias {{param.fontAliasName|default:"Font"}} = {{fontType}}.Font
|
||||||
|
|
||||||
|
// swiftlint:disable superfluous_disable_command
|
||||||
|
// swiftlint:disable file_length
|
||||||
|
// swiftlint:disable implicit_return
|
||||||
|
|
||||||
|
// MARK: - Fonts
|
||||||
|
|
||||||
|
// swiftlint:disable identifier_name line_length type_body_length
|
||||||
|
{% macro transformPath path %}{% filter removeNewlines %}
|
||||||
|
{% if param.preservePath %}
|
||||||
|
{{path}}
|
||||||
|
{% else %}
|
||||||
|
{{path|basename}}
|
||||||
|
{% endif %}
|
||||||
|
{% endfilter %}{% endmacro %}
|
||||||
|
{{accessModifier}} enum {{param.enumName|default:"FontFamily"}} {
|
||||||
|
{% for family in families %}
|
||||||
|
{{accessModifier}} enum {{family.name|swiftIdentifier:"pretty"|escapeReservedKeywords}} {
|
||||||
|
{% for font in family.fonts %}
|
||||||
|
{{accessModifier}} static let {{font.style|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}} = {{fontType}}(name: "{{font.name}}", family: "{{family.name}}", path: "{% call transformPath font.path %}")
|
||||||
|
{% endfor %}
|
||||||
|
{{accessModifier}} static let all: [{{fontType}}] = [{% for font in family.fonts %}{{font.style|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}}{{ ", " if not forloop.last }}{% endfor %}]
|
||||||
|
}
|
||||||
|
{% endfor %}
|
||||||
|
{{accessModifier}} static let allCustomFonts: [{{fontType}}] = [{% for family in families %}{{family.name|swiftIdentifier:"pretty"|escapeReservedKeywords}}.all{{ ", " if not forloop.last }}{% endfor %}].flatMap { $0 }
|
||||||
|
{{accessModifier}} static func registerAllCustomFonts() {
|
||||||
|
allCustomFonts.forEach { $0.register() }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// swiftlint:enable identifier_name line_length type_body_length
|
||||||
|
|
||||||
|
// MARK: - Implementation Details
|
||||||
|
|
||||||
|
{{accessModifier}} struct {{fontType}} {
|
||||||
|
{{accessModifier}} let name: String
|
||||||
|
{{accessModifier}} let family: String
|
||||||
|
{{accessModifier}} let path: String
|
||||||
|
|
||||||
|
#if os(macOS)
|
||||||
|
{{accessModifier}} typealias Font = NSFont
|
||||||
|
#elseif os(iOS) || os(tvOS) || os(watchOS)
|
||||||
|
{{accessModifier}} typealias Font = UIFont
|
||||||
|
#endif
|
||||||
|
|
||||||
|
{{accessModifier}} func font(size: CGFloat) -> Font! {
|
||||||
|
return Font(font: self, size: size)
|
||||||
|
}
|
||||||
|
|
||||||
|
{{accessModifier}} func register() {
|
||||||
|
// swiftlint:disable:next conditional_returns_on_newline
|
||||||
|
guard let url = url else { return }
|
||||||
|
CTFontManagerRegisterFontsForURL(url as CFURL, .process, nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
fileprivate var url: URL? {
|
||||||
|
{% if param.lookupFunction %}
|
||||||
|
return {{param.lookupFunction}}(name, family, path)
|
||||||
|
{% else %}
|
||||||
|
return {{param.bundle|default:"BundleToken.bundle"}}.url(forResource: path, withExtension: nil)
|
||||||
|
{% endif %}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
{{accessModifier}} extension {{fontType}}.Font {
|
||||||
|
convenience init?(font: {{fontType}}, size: CGFloat) {
|
||||||
|
#if os(iOS) || os(tvOS) || os(watchOS)
|
||||||
|
if !UIFont.fontNames(forFamilyName: font.family).contains(font.name) {
|
||||||
|
font.register()
|
||||||
|
}
|
||||||
|
#elseif os(macOS)
|
||||||
|
if let url = font.url, CTFontManagerGetScopeForURL(url as CFURL) == .none {
|
||||||
|
font.register()
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
self.init(name: font.name, size: size)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
{% 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 fonts found
|
||||||
|
{% endif %}
|
|
@ -0,0 +1,113 @@
|
||||||
|
// swiftlint:disable all
|
||||||
|
// Generated using SwiftGen — https://github.com/SwiftGen/SwiftGen
|
||||||
|
|
||||||
|
{% if families %}
|
||||||
|
{% set accessModifier %}{% if param.publicAccess %}public{% else %}internal{% endif %}{% endset %}
|
||||||
|
{% set fontType %}{{param.fontTypeName|default:"FontConvertible"}}{% endset %}
|
||||||
|
#if os(macOS)
|
||||||
|
import AppKit.NSFont
|
||||||
|
#elseif os(iOS) || os(tvOS) || os(watchOS)
|
||||||
|
import UIKit.UIFont
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Deprecated typealiases
|
||||||
|
@available(*, deprecated, renamed: "{{fontType}}.Font", message: "This typealias will be removed in SwiftGen 7.0")
|
||||||
|
{{accessModifier}} typealias {{param.fontAliasName|default:"Font"}} = {{fontType}}.Font
|
||||||
|
|
||||||
|
// swiftlint:disable superfluous_disable_command
|
||||||
|
// swiftlint:disable file_length
|
||||||
|
|
||||||
|
// MARK: - Fonts
|
||||||
|
|
||||||
|
// swiftlint:disable identifier_name line_length type_body_length
|
||||||
|
{% macro transformPath path %}{% filter removeNewlines %}
|
||||||
|
{% if param.preservePath %}
|
||||||
|
{{path}}
|
||||||
|
{% else %}
|
||||||
|
{{path|basename}}
|
||||||
|
{% endif %}
|
||||||
|
{% endfilter %}{% endmacro %}
|
||||||
|
{{accessModifier}} enum {{param.enumName|default:"FontFamily"}} {
|
||||||
|
{% for family in families %}
|
||||||
|
{{accessModifier}} enum {{family.name|swiftIdentifier:"pretty"|escapeReservedKeywords}} {
|
||||||
|
{% for font in family.fonts %}
|
||||||
|
{{accessModifier}} static let {{font.style|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}} = {{fontType}}(name: "{{font.name}}", family: "{{family.name}}", path: "{% call transformPath font.path %}")
|
||||||
|
{% endfor %}
|
||||||
|
{{accessModifier}} static let all: [{{fontType}}] = [{% for font in family.fonts %}{{font.style|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}}{{ ", " if not forloop.last }}{% endfor %}]
|
||||||
|
}
|
||||||
|
{% endfor %}
|
||||||
|
{{accessModifier}} static let allCustomFonts: [{{fontType}}] = [{% for family in families %}{{family.name|swiftIdentifier:"pretty"|escapeReservedKeywords}}.all{{ ", " if not forloop.last }}{% endfor %}].flatMap { $0 }
|
||||||
|
{{accessModifier}} static func registerAllCustomFonts() {
|
||||||
|
allCustomFonts.forEach { $0.register() }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// swiftlint:enable identifier_name line_length type_body_length
|
||||||
|
|
||||||
|
// MARK: - Implementation Details
|
||||||
|
|
||||||
|
{{accessModifier}} struct {{fontType}} {
|
||||||
|
{{accessModifier}} let name: String
|
||||||
|
{{accessModifier}} let family: String
|
||||||
|
{{accessModifier}} let path: String
|
||||||
|
|
||||||
|
#if os(macOS)
|
||||||
|
{{accessModifier}} typealias Font = NSFont
|
||||||
|
#elseif os(iOS) || os(tvOS) || os(watchOS)
|
||||||
|
{{accessModifier}} typealias Font = UIFont
|
||||||
|
#endif
|
||||||
|
|
||||||
|
{{accessModifier}} func font(size: CGFloat) -> Font {
|
||||||
|
guard let font = Font(font: self, size: size) else {
|
||||||
|
fatalError("Unable to initialize font '\(name)' (\(family))")
|
||||||
|
}
|
||||||
|
return font
|
||||||
|
}
|
||||||
|
|
||||||
|
{{accessModifier}} func register() {
|
||||||
|
// swiftlint:disable:next conditional_returns_on_newline
|
||||||
|
guard let url = url else { return }
|
||||||
|
CTFontManagerRegisterFontsForURL(url as CFURL, .process, nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
fileprivate var url: URL? {
|
||||||
|
// swiftlint:disable:next implicit_return
|
||||||
|
{% if param.lookupFunction %}
|
||||||
|
return {{param.lookupFunction}}(name, family, path)
|
||||||
|
{% else %}
|
||||||
|
return {{param.bundle|default:"BundleToken.bundle"}}.url(forResource: path, withExtension: nil)
|
||||||
|
{% endif %}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
{{accessModifier}} extension {{fontType}}.Font {
|
||||||
|
convenience init?(font: {{fontType}}, size: CGFloat) {
|
||||||
|
#if os(iOS) || os(tvOS) || os(watchOS)
|
||||||
|
if !UIFont.fontNames(forFamilyName: font.family).contains(font.name) {
|
||||||
|
font.register()
|
||||||
|
}
|
||||||
|
#elseif os(macOS)
|
||||||
|
if let url = font.url, CTFontManagerGetScopeForURL(url as CFURL) == .none {
|
||||||
|
font.register()
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
self.init(name: font.name, size: size)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
{% 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 fonts found
|
||||||
|
{% endif %}
|
|
@ -0,0 +1,157 @@
|
||||||
|
// swiftlint:disable all
|
||||||
|
// Generated using SwiftGen — https://github.com/SwiftGen/SwiftGen
|
||||||
|
|
||||||
|
{% if platform and storyboards %}
|
||||||
|
{% set accessModifier %}{% if param.publicAccess %}public{% else %}internal{% endif %}{% endset %}
|
||||||
|
{% set isAppKit %}{% if platform == "macOS" %}true{% endif %}{% endset %}
|
||||||
|
{% set prefix %}{% if isAppKit %}NS{% else %}UI{% endif %}{% endset %}
|
||||||
|
{% set controller %}{% if isAppKit %}Controller{% else %}ViewController{% endif %}{% endset %}
|
||||||
|
// swiftlint:disable sorted_imports
|
||||||
|
import Foundation
|
||||||
|
{% for module in modules where module != env.PRODUCT_MODULE_NAME and module != param.module %}
|
||||||
|
import {{module}}
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
// swiftlint:disable superfluous_disable_command
|
||||||
|
// swiftlint:disable file_length implicit_return
|
||||||
|
|
||||||
|
// MARK: - Storyboard Scenes
|
||||||
|
|
||||||
|
// swiftlint:disable explicit_type_interface identifier_name line_length type_body_length type_name
|
||||||
|
{% macro moduleName item %}{% filter removeNewlines %}
|
||||||
|
{% if item.moduleIsPlaceholder %}
|
||||||
|
{{ env.PRODUCT_MODULE_NAME|default:param.module }}
|
||||||
|
{% else %}
|
||||||
|
{{ item.module }}
|
||||||
|
{% endif %}
|
||||||
|
{% endfilter %}{% endmacro %}
|
||||||
|
{% macro className item %}{% filter removeNewlines %}
|
||||||
|
{% set module %}{% call moduleName item %}{% endset %}
|
||||||
|
{% if module and ( not param.ignoreTargetModule or module != env.PRODUCT_MODULE_NAME and module != param.module ) %}
|
||||||
|
{{module}}.
|
||||||
|
{% endif %}
|
||||||
|
{{item.type}}
|
||||||
|
{% endfilter %}{% endmacro %}
|
||||||
|
{{accessModifier}} enum {{param.enumName|default:"StoryboardScene"}} {
|
||||||
|
{% for storyboard in storyboards %}
|
||||||
|
{% set storyboardName %}{{storyboard.name|swiftIdentifier:"pretty"|escapeReservedKeywords}}{% endset %}
|
||||||
|
{{accessModifier}} enum {{storyboardName}}: StoryboardType {
|
||||||
|
{{accessModifier}} static let storyboardName = "{{storyboard.name}}"
|
||||||
|
{% if storyboard.initialScene %}
|
||||||
|
|
||||||
|
{% set sceneClass %}{% call className storyboard.initialScene %}{% endset %}
|
||||||
|
{{accessModifier}} static let initialScene = InitialSceneType<{{sceneClass}}>(storyboard: {{storyboardName}}.self)
|
||||||
|
{% endif %}
|
||||||
|
{% for scene in storyboard.scenes %}
|
||||||
|
|
||||||
|
{% set sceneID %}{{scene.identifier|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}}{% endset %}
|
||||||
|
{% set sceneClass %}{% call className scene %}{% endset %}
|
||||||
|
{{accessModifier}} static let {{sceneID}} = SceneType<{{sceneClass}}>(storyboard: {{storyboardName}}.self, identifier: "{{scene.identifier}}")
|
||||||
|
{% endfor %}
|
||||||
|
}
|
||||||
|
{% endfor %}
|
||||||
|
}
|
||||||
|
// swiftlint:enable explicit_type_interface identifier_name line_length type_body_length type_name
|
||||||
|
|
||||||
|
// MARK: - Implementation Details
|
||||||
|
|
||||||
|
{{accessModifier}} protocol StoryboardType {
|
||||||
|
static var storyboardName: String { get }
|
||||||
|
}
|
||||||
|
|
||||||
|
{{accessModifier}} extension StoryboardType {
|
||||||
|
static var storyboard: {{prefix}}Storyboard {
|
||||||
|
let name = {% if isAppKit %}NSStoryboard.Name({% endif %}self.storyboardName{% if isAppKit %}){% endif %}
|
||||||
|
{% if param.lookupFunction %}
|
||||||
|
return {{param.lookupFunction}}(name)
|
||||||
|
{% else %}
|
||||||
|
return {{prefix}}Storyboard(name: name, bundle: {{param.bundle|default:"BundleToken.bundle"}})
|
||||||
|
{% endif %}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
{{accessModifier}} struct SceneType<T{% if not isAppKit %}: UIViewController{% endif %}> {
|
||||||
|
{{accessModifier}} let storyboard: StoryboardType.Type
|
||||||
|
{{accessModifier}} let identifier: String
|
||||||
|
|
||||||
|
{{accessModifier}} func instantiate() -> T {
|
||||||
|
let identifier = {% if isAppKit %}NSStoryboard.SceneIdentifier({% endif %}self.identifier{% if isAppKit %}){% endif %}
|
||||||
|
guard let controller = storyboard.storyboard.instantiate{{controller}}(withIdentifier: identifier) as? T else {
|
||||||
|
fatalError("{{controller}} '\(identifier)' is not of the expected class \(T.self).")
|
||||||
|
}
|
||||||
|
return controller
|
||||||
|
}
|
||||||
|
|
||||||
|
{% if isAppKit %}
|
||||||
|
@available(macOS 10.15, *)
|
||||||
|
{{accessModifier}} func instantiate(creator block: @escaping (NSCoder) -> T?) -> T where T: NSViewController {
|
||||||
|
return storyboard.storyboard.instantiate{{controller}}(identifier: identifier, creator: block)
|
||||||
|
}
|
||||||
|
|
||||||
|
@available(macOS 10.15, *)
|
||||||
|
{{accessModifier}} func instantiate(creator block: @escaping (NSCoder) -> T?) -> T where T: NSWindowController {
|
||||||
|
return storyboard.storyboard.instantiate{{controller}}(identifier: identifier, creator: block)
|
||||||
|
}
|
||||||
|
{% else %}
|
||||||
|
@available(iOS 13.0, tvOS 13.0, *)
|
||||||
|
{{accessModifier}} func instantiate(creator block: @escaping (NSCoder) -> T?) -> T {
|
||||||
|
return storyboard.storyboard.instantiate{{controller}}(identifier: identifier, creator: block)
|
||||||
|
}
|
||||||
|
{% endif %}
|
||||||
|
}
|
||||||
|
|
||||||
|
{{accessModifier}} struct InitialSceneType<T{% if not isAppKit %}: UIViewController{% endif %}> {
|
||||||
|
{{accessModifier}} let storyboard: StoryboardType.Type
|
||||||
|
|
||||||
|
{{accessModifier}} func instantiate() -> T {
|
||||||
|
guard let controller = storyboard.storyboard.instantiateInitial{{controller}}() as? T else {
|
||||||
|
fatalError("{{controller}} is not of the expected class \(T.self).")
|
||||||
|
}
|
||||||
|
return controller
|
||||||
|
}
|
||||||
|
|
||||||
|
{% if isAppKit %}
|
||||||
|
@available(macOS 10.15, *)
|
||||||
|
{{accessModifier}} func instantiate(creator block: @escaping (NSCoder) -> T?) -> T where T: NSViewController {
|
||||||
|
guard let controller = storyboard.storyboard.instantiateInitial{{controller}}(creator: block) else {
|
||||||
|
fatalError("Storyboard \(storyboard.storyboardName) does not have an initial scene.")
|
||||||
|
}
|
||||||
|
return controller
|
||||||
|
}
|
||||||
|
|
||||||
|
@available(macOS 10.15, *)
|
||||||
|
{{accessModifier}} func instantiate(creator block: @escaping (NSCoder) -> T?) -> T where T: NSWindowController {
|
||||||
|
guard let controller = storyboard.storyboard.instantiateInitial{{controller}}(creator: block) else {
|
||||||
|
fatalError("Storyboard \(storyboard.storyboardName) does not have an initial scene.")
|
||||||
|
}
|
||||||
|
return controller
|
||||||
|
}
|
||||||
|
{% else %}
|
||||||
|
@available(iOS 13.0, tvOS 13.0, *)
|
||||||
|
{{accessModifier}} func instantiate(creator block: @escaping (NSCoder) -> T?) -> T {
|
||||||
|
guard let controller = storyboard.storyboard.instantiateInitial{{controller}}(creator: block) else {
|
||||||
|
fatalError("Storyboard \(storyboard.storyboardName) does not have an initial scene.")
|
||||||
|
}
|
||||||
|
return controller
|
||||||
|
}
|
||||||
|
{% endif %}
|
||||||
|
}
|
||||||
|
{% 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 %}
|
||||||
|
{% elif storyboards %}
|
||||||
|
// Mixed AppKit and UIKit storyboard files found, please invoke swiftgen with these separately
|
||||||
|
{% else %}
|
||||||
|
// No storyboard found
|
||||||
|
{% endif %}
|
|
@ -0,0 +1,159 @@
|
||||||
|
// swiftlint:disable all
|
||||||
|
// Generated using SwiftGen — https://github.com/SwiftGen/SwiftGen
|
||||||
|
|
||||||
|
{% if platform and storyboards %}
|
||||||
|
{% set accessModifier %}{% if param.publicAccess %}public{% else %}internal{% endif %}{% endset %}
|
||||||
|
{% set isAppKit %}{% if platform == "macOS" %}true{% endif %}{% endset %}
|
||||||
|
{% set prefix %}{% if isAppKit %}NS{% else %}UI{% endif %}{% endset %}
|
||||||
|
{% set controller %}{% if isAppKit %}Controller{% else %}ViewController{% endif %}{% endset %}
|
||||||
|
// swiftlint:disable sorted_imports
|
||||||
|
import Foundation
|
||||||
|
{% for module in modules where module != env.PRODUCT_MODULE_NAME and module != param.module %}
|
||||||
|
import {{module}}
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
// swiftlint:disable superfluous_disable_command
|
||||||
|
// swiftlint:disable file_length implicit_return
|
||||||
|
|
||||||
|
// MARK: - Storyboard Scenes
|
||||||
|
|
||||||
|
// swiftlint:disable explicit_type_interface identifier_name line_length type_body_length type_name
|
||||||
|
{% macro moduleName item %}{% filter removeNewlines %}
|
||||||
|
{% if item.moduleIsPlaceholder %}
|
||||||
|
{{ env.PRODUCT_MODULE_NAME|default:param.module }}
|
||||||
|
{% else %}
|
||||||
|
{{ item.module }}
|
||||||
|
{% endif %}
|
||||||
|
{% endfilter %}{% endmacro %}
|
||||||
|
{% macro className item %}{% filter removeNewlines %}
|
||||||
|
{% set module %}{% call moduleName item %}{% endset %}
|
||||||
|
{% if module and ( not param.ignoreTargetModule or module != env.PRODUCT_MODULE_NAME and module != param.module ) %}
|
||||||
|
{{module}}.
|
||||||
|
{% endif %}
|
||||||
|
{{item.type}}
|
||||||
|
{% endfilter %}{% endmacro %}
|
||||||
|
{{accessModifier}} enum {{param.enumName|default:"StoryboardScene"}} {
|
||||||
|
{% for storyboard in storyboards %}
|
||||||
|
{% set storyboardName %}{{storyboard.name|swiftIdentifier:"pretty"|escapeReservedKeywords}}{% endset %}
|
||||||
|
{{accessModifier}} enum {{storyboardName}}: StoryboardType {
|
||||||
|
{{accessModifier}} static let storyboardName = "{{storyboard.name}}"
|
||||||
|
{% if storyboard.initialScene %}
|
||||||
|
|
||||||
|
{% set sceneClass %}{% call className storyboard.initialScene %}{% endset %}
|
||||||
|
{{accessModifier}} static let initialScene = InitialSceneType<{{sceneClass}}>(storyboard: {{storyboardName}}.self)
|
||||||
|
{% endif %}
|
||||||
|
{% for scene in storyboard.scenes %}
|
||||||
|
|
||||||
|
{% set sceneID %}{{scene.identifier|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}}{% endset %}
|
||||||
|
{% set sceneClass %}{% call className scene %}{% endset %}
|
||||||
|
{{accessModifier}} static let {{sceneID}} = SceneType<{{sceneClass}}>(storyboard: {{storyboardName}}.self, identifier: "{{scene.identifier}}")
|
||||||
|
{% endfor %}
|
||||||
|
}
|
||||||
|
{% endfor %}
|
||||||
|
}
|
||||||
|
// swiftlint:enable explicit_type_interface identifier_name line_length type_body_length type_name
|
||||||
|
|
||||||
|
// MARK: - Implementation Details
|
||||||
|
|
||||||
|
{{accessModifier}} protocol StoryboardType {
|
||||||
|
static var storyboardName: String { get }
|
||||||
|
}
|
||||||
|
|
||||||
|
{{accessModifier}} extension StoryboardType {
|
||||||
|
static var storyboard: {{prefix}}Storyboard {
|
||||||
|
let name = {% if isAppKit %}NSStoryboard.Name({% endif %}self.storyboardName{% if isAppKit %}){% endif %}
|
||||||
|
{% if param.lookupFunction %}
|
||||||
|
return {{param.lookupFunction}}(name)
|
||||||
|
{% else %}
|
||||||
|
return {{prefix}}Storyboard(name: name, bundle: {{param.bundle|default:"BundleToken.bundle"}})
|
||||||
|
{% endif %}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
{{accessModifier}} struct SceneType<T{% if not isAppKit %}: UIViewController{% endif %}> {
|
||||||
|
{{accessModifier}} let storyboard: StoryboardType.Type
|
||||||
|
{{accessModifier}} let identifier: String
|
||||||
|
|
||||||
|
{{accessModifier}} func instantiate() -> T {
|
||||||
|
let identifier = {% if isAppKit %}NSStoryboard.SceneIdentifier({% endif %}self.identifier{% if isAppKit %}){% endif %}
|
||||||
|
guard let controller = storyboard.storyboard.instantiate{{controller}}(withIdentifier: identifier) as? T else {
|
||||||
|
fatalError("{{controller}} '\(identifier)' is not of the expected class \(T.self).")
|
||||||
|
}
|
||||||
|
return controller
|
||||||
|
}
|
||||||
|
|
||||||
|
{% if isAppKit %}
|
||||||
|
@available(macOS 10.15, *)
|
||||||
|
{{accessModifier}} func instantiate(creator block: @escaping (NSCoder) -> T?) -> T where T: NSViewController {
|
||||||
|
let identifier = NSStoryboard.SceneIdentifier(self.identifier)
|
||||||
|
return storyboard.storyboard.instantiate{{controller}}(identifier: identifier, creator: block)
|
||||||
|
}
|
||||||
|
|
||||||
|
@available(macOS 10.15, *)
|
||||||
|
{{accessModifier}} func instantiate(creator block: @escaping (NSCoder) -> T?) -> T where T: NSWindowController {
|
||||||
|
let identifier = NSStoryboard.SceneIdentifier(self.identifier)
|
||||||
|
return storyboard.storyboard.instantiate{{controller}}(identifier: identifier, creator: block)
|
||||||
|
}
|
||||||
|
{% else %}
|
||||||
|
@available(iOS 13.0, tvOS 13.0, *)
|
||||||
|
{{accessModifier}} func instantiate(creator block: @escaping (NSCoder) -> T?) -> T {
|
||||||
|
return storyboard.storyboard.instantiate{{controller}}(identifier: identifier, creator: block)
|
||||||
|
}
|
||||||
|
{% endif %}
|
||||||
|
}
|
||||||
|
|
||||||
|
{{accessModifier}} struct InitialSceneType<T{% if not isAppKit %}: UIViewController{% endif %}> {
|
||||||
|
{{accessModifier}} let storyboard: StoryboardType.Type
|
||||||
|
|
||||||
|
{{accessModifier}} func instantiate() -> T {
|
||||||
|
guard let controller = storyboard.storyboard.instantiateInitial{{controller}}() as? T else {
|
||||||
|
fatalError("{{controller}} is not of the expected class \(T.self).")
|
||||||
|
}
|
||||||
|
return controller
|
||||||
|
}
|
||||||
|
|
||||||
|
{% if isAppKit %}
|
||||||
|
@available(macOS 10.15, *)
|
||||||
|
{{accessModifier}} func instantiate(creator block: @escaping (NSCoder) -> T?) -> T where T: NSViewController {
|
||||||
|
guard let controller = storyboard.storyboard.instantiateInitial{{controller}}(creator: block) else {
|
||||||
|
fatalError("Storyboard \(storyboard.storyboardName) does not have an initial scene.")
|
||||||
|
}
|
||||||
|
return controller
|
||||||
|
}
|
||||||
|
|
||||||
|
@available(macOS 10.15, *)
|
||||||
|
{{accessModifier}} func instantiate(creator block: @escaping (NSCoder) -> T?) -> T where T: NSWindowController {
|
||||||
|
guard let controller = storyboard.storyboard.instantiateInitial{{controller}}(creator: block) else {
|
||||||
|
fatalError("Storyboard \(storyboard.storyboardName) does not have an initial scene.")
|
||||||
|
}
|
||||||
|
return controller
|
||||||
|
}
|
||||||
|
{% else %}
|
||||||
|
@available(iOS 13.0, tvOS 13.0, *)
|
||||||
|
{{accessModifier}} func instantiate(creator block: @escaping (NSCoder) -> T?) -> T {
|
||||||
|
guard let controller = storyboard.storyboard.instantiateInitial{{controller}}(creator: block) else {
|
||||||
|
fatalError("Storyboard \(storyboard.storyboardName) does not have an initial scene.")
|
||||||
|
}
|
||||||
|
return controller
|
||||||
|
}
|
||||||
|
{% endif %}
|
||||||
|
}
|
||||||
|
{% 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 %}
|
||||||
|
{% elif storyboards %}
|
||||||
|
// Mixed AppKit and UIKit storyboard files found, please invoke swiftgen with these separately
|
||||||
|
{% else %}
|
||||||
|
// No storyboard found
|
||||||
|
{% endif %}
|
|
@ -0,0 +1,60 @@
|
||||||
|
// swiftlint:disable all
|
||||||
|
// Generated using SwiftGen — https://github.com/SwiftGen/SwiftGen
|
||||||
|
|
||||||
|
{% if platform and storyboards %}
|
||||||
|
{% set accessModifier %}{% if param.publicAccess %}public{% else %}internal{% endif %}{% endset %}
|
||||||
|
{% set isAppKit %}{% if platform == "macOS" %}true{% endif %}{% endset %}
|
||||||
|
// swiftlint:disable sorted_imports
|
||||||
|
import Foundation
|
||||||
|
{% for module in modules where module != env.PRODUCT_MODULE_NAME and module != param.module %}
|
||||||
|
import {{module}}
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
// swiftlint:disable superfluous_disable_command
|
||||||
|
// swiftlint:disable file_length
|
||||||
|
|
||||||
|
// MARK: - Storyboard Segues
|
||||||
|
|
||||||
|
// swiftlint:disable explicit_type_interface identifier_name line_length type_body_length type_name
|
||||||
|
{{accessModifier}} enum {{param.enumName|default:"StoryboardSegue"}} {
|
||||||
|
{% for storyboard in storyboards where storyboard.segues %}
|
||||||
|
{{accessModifier}} enum {{storyboard.name|swiftIdentifier:"pretty"|escapeReservedKeywords}}: String, SegueType {
|
||||||
|
{% for segue in storyboard.segues %}
|
||||||
|
{% set segueID %}{{segue.identifier|swiftIdentifier:"pretty"|lowerFirstWord}}{% endset %}
|
||||||
|
case {{segueID|escapeReservedKeywords}}{% if segueID != segue.identifier %} = "{{segue.identifier}}"{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
}
|
||||||
|
{% endfor %}
|
||||||
|
}
|
||||||
|
// swiftlint:enable explicit_type_interface identifier_name line_length type_body_length type_name
|
||||||
|
|
||||||
|
// MARK: - Implementation Details
|
||||||
|
|
||||||
|
{{accessModifier}} protocol SegueType: RawRepresentable {}
|
||||||
|
|
||||||
|
{{accessModifier}} extension {% if isAppKit %}NSSeguePerforming{% else %}UIViewController{% endif %} {
|
||||||
|
func perform<S: SegueType>(segue: S, sender: Any? = nil) where S.RawValue == String {
|
||||||
|
let identifier = {% if isAppKit %}NSStoryboardSegue.Identifier({% endif %}segue.rawValue{% if isAppKit %}){% endif %}
|
||||||
|
performSegue{% if isAppKit %}?{% endif %}(withIdentifier: identifier, sender: sender)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
{{accessModifier}} extension SegueType where RawValue == String {
|
||||||
|
init?(_ segue: {% if isAppKit %}NS{% else %}UI{% endif %}StoryboardSegue) {
|
||||||
|
{% if isAppKit %}
|
||||||
|
#if swift(>=4.2)
|
||||||
|
guard let identifier = segue.identifier else { return nil }
|
||||||
|
#else
|
||||||
|
guard let identifier = segue.identifier?.rawValue else { return nil }
|
||||||
|
#endif
|
||||||
|
{% else %}
|
||||||
|
guard let identifier = segue.identifier else { return nil }
|
||||||
|
{% endif %}
|
||||||
|
self.init(rawValue: identifier)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
{% elif storyboards %}
|
||||||
|
// Mixed AppKit and UIKit storyboard files found, please invoke swiftgen with these separately
|
||||||
|
{% else %}
|
||||||
|
// No storyboard found
|
||||||
|
{% endif %}
|
|
@ -0,0 +1,60 @@
|
||||||
|
// swiftlint:disable all
|
||||||
|
// Generated using SwiftGen — https://github.com/SwiftGen/SwiftGen
|
||||||
|
|
||||||
|
{% if platform and storyboards %}
|
||||||
|
{% set accessModifier %}{% if param.publicAccess %}public{% else %}internal{% endif %}{% endset %}
|
||||||
|
{% set isAppKit %}{% if platform == "macOS" %}true{% endif %}{% endset %}
|
||||||
|
// swiftlint:disable sorted_imports
|
||||||
|
import Foundation
|
||||||
|
{% for module in modules where module != env.PRODUCT_MODULE_NAME and module != param.module %}
|
||||||
|
import {{module}}
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
// swiftlint:disable superfluous_disable_command
|
||||||
|
// swiftlint:disable file_length
|
||||||
|
|
||||||
|
// MARK: - Storyboard Segues
|
||||||
|
|
||||||
|
// swiftlint:disable explicit_type_interface identifier_name line_length type_body_length type_name
|
||||||
|
{{accessModifier}} enum {{param.enumName|default:"StoryboardSegue"}} {
|
||||||
|
{% for storyboard in storyboards where storyboard.segues %}
|
||||||
|
{{accessModifier}} enum {{storyboard.name|swiftIdentifier:"pretty"|escapeReservedKeywords}}: String, SegueType {
|
||||||
|
{% for segue in storyboard.segues %}
|
||||||
|
{% set segueID %}{{segue.identifier|swiftIdentifier:"pretty"|lowerFirstWord}}{% endset %}
|
||||||
|
case {{segueID|escapeReservedKeywords}}{% if segueID != segue.identifier %} = "{{segue.identifier}}"{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
}
|
||||||
|
{% endfor %}
|
||||||
|
}
|
||||||
|
// swiftlint:enable explicit_type_interface identifier_name line_length type_body_length type_name
|
||||||
|
|
||||||
|
// MARK: - Implementation Details
|
||||||
|
|
||||||
|
{{accessModifier}} protocol SegueType: RawRepresentable {}
|
||||||
|
|
||||||
|
{{accessModifier}} extension {% if isAppKit %}NSSeguePerforming{% else %}UIViewController{% endif %} {
|
||||||
|
func perform<S: SegueType>(segue: S, sender: Any? = nil) where S.RawValue == String {
|
||||||
|
let identifier = {% if isAppKit %}NSStoryboardSegue.Identifier({% endif %}segue.rawValue{% if isAppKit %}){% endif %}
|
||||||
|
performSegue{% if isAppKit %}?{% endif %}(withIdentifier: identifier, sender: sender)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
{{accessModifier}} extension SegueType where RawValue == String {
|
||||||
|
init?(_ segue: {% if isAppKit %}NS{% else %}UI{% endif %}StoryboardSegue) {
|
||||||
|
{% if isAppKit %}
|
||||||
|
#if swift(>=4.2)
|
||||||
|
guard let identifier = segue.identifier else { return nil }
|
||||||
|
#else
|
||||||
|
guard let identifier = segue.identifier?.rawValue else { return nil }
|
||||||
|
#endif
|
||||||
|
{% else %}
|
||||||
|
guard let identifier = segue.identifier else { return nil }
|
||||||
|
{% endif %}
|
||||||
|
self.init(rawValue: identifier)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
{% elif storyboards %}
|
||||||
|
// Mixed AppKit and UIKit storyboard files found, please invoke swiftgen with these separately
|
||||||
|
{% else %}
|
||||||
|
// No storyboard found
|
||||||
|
{% endif %}
|
|
@ -0,0 +1,82 @@
|
||||||
|
// 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: - JSON 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}} = {% call valueBlock document.data document.metadata %}
|
||||||
|
{% elif document.metadata.type == "Dictionary" %}
|
||||||
|
{% for key,value in document.metadata.properties %}
|
||||||
|
{{accessModifier}} {% call propertyBlock key value document.data %}
|
||||||
|
{% endfor %}
|
||||||
|
{% else %}
|
||||||
|
{{accessModifier}} static let value: {{rootType}} = {% call valueBlock document.data document.metadata %}
|
||||||
|
{% endif %}
|
||||||
|
{% endmacro %}
|
||||||
|
{% macro typeBlock metadata %}{% filter removeNewlines:"leading" %}
|
||||||
|
{% if metadata.type == "Array" %}
|
||||||
|
[{% call typeBlock metadata.element %}]
|
||||||
|
{% elif metadata.type == "Dictionary" %}
|
||||||
|
[String: Any]
|
||||||
|
{% elif metadata.type == "Optional" %}
|
||||||
|
Any?
|
||||||
|
{% else %}
|
||||||
|
{{metadata.type}}
|
||||||
|
{% endif %}
|
||||||
|
{% endfilter %}{% endmacro %}
|
||||||
|
{% macro propertyBlock key metadata data %}{% filter removeNewlines:"leading" %}
|
||||||
|
{% set propertyName %}{{key|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}}{% endset %}
|
||||||
|
{% set propertyType %}{% call typeBlock metadata %}{% endset %}
|
||||||
|
static let {{propertyName}}: {{propertyType}} = {% call valueBlock data[key] metadata %}
|
||||||
|
{% endfilter %}{% endmacro %}
|
||||||
|
{% macro valueBlock value metadata %}{% filter removeNewlines:"leading" %}
|
||||||
|
{% if metadata.type == "String" %}
|
||||||
|
"{{ value }}"
|
||||||
|
{% elif metadata.type == "Optional" %}
|
||||||
|
nil
|
||||||
|
{% elif metadata.type == "Array" and value %}
|
||||||
|
[{% for value in value %}
|
||||||
|
{% call valueBlock value metadata.element.items[forloop.counter0]|default:metadata.element %}
|
||||||
|
{{ ", " if not forloop.last }}
|
||||||
|
{% endfor %}]
|
||||||
|
{% elif metadata.type == "Dictionary" %}
|
||||||
|
[{% for key,value in value %}
|
||||||
|
"{{key}}": {% call valueBlock value metadata.properties[key] %}
|
||||||
|
{{ ", " if not forloop.last }}
|
||||||
|
{% empty %}
|
||||||
|
:
|
||||||
|
{% endfor %}]
|
||||||
|
{% elif metadata.type == "Bool" %}
|
||||||
|
{% if value %}true{% else %}false{% endif %}
|
||||||
|
{% else %}
|
||||||
|
{{ value }}
|
||||||
|
{% endif %}
|
||||||
|
{% endfilter %}{% endmacro %}
|
||||||
|
|
||||||
|
// swiftlint:disable identifier_name line_length number_separator type_body_length
|
||||||
|
{{accessModifier}} enum {{param.enumName|default:"JSONFiles"}} {
|
||||||
|
{% if files.count > 1 or param.forceFileNameEnum %}
|
||||||
|
{% for file in files %}
|
||||||
|
{{accessModifier}} enum {{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 number_separator type_body_length
|
||||||
|
{% else %}
|
||||||
|
// No files found
|
||||||
|
{% endif %}
|
|
@ -0,0 +1,82 @@
|
||||||
|
// 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: - JSON 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}} = {% call valueBlock document.data document.metadata %}
|
||||||
|
{% elif document.metadata.type == "Dictionary" %}
|
||||||
|
{% for key,value in document.metadata.properties %}
|
||||||
|
{{accessModifier}} {% call propertyBlock key value document.data %}
|
||||||
|
{% endfor %}
|
||||||
|
{% else %}
|
||||||
|
{{accessModifier}} static let value: {{rootType}} = {% call valueBlock document.data document.metadata %}
|
||||||
|
{% endif %}
|
||||||
|
{% endmacro %}
|
||||||
|
{% macro typeBlock metadata %}{% filter removeNewlines:"leading" %}
|
||||||
|
{% if metadata.type == "Array" %}
|
||||||
|
[{% call typeBlock metadata.element %}]
|
||||||
|
{% elif metadata.type == "Dictionary" %}
|
||||||
|
[String: Any]
|
||||||
|
{% elif metadata.type == "Optional" %}
|
||||||
|
Any?
|
||||||
|
{% else %}
|
||||||
|
{{metadata.type}}
|
||||||
|
{% endif %}
|
||||||
|
{% endfilter %}{% endmacro %}
|
||||||
|
{% macro propertyBlock key metadata data %}{% filter removeNewlines:"leading" %}
|
||||||
|
{% set propertyName %}{{key|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}}{% endset %}
|
||||||
|
{% set propertyType %}{% call typeBlock metadata %}{% endset %}
|
||||||
|
static let {{propertyName}}: {{propertyType}} = {% call valueBlock data[key] metadata %}
|
||||||
|
{% endfilter %}{% endmacro %}
|
||||||
|
{% macro valueBlock value metadata %}{% filter removeNewlines:"leading" %}
|
||||||
|
{% if metadata.type == "String" %}
|
||||||
|
"{{ value }}"
|
||||||
|
{% elif metadata.type == "Optional" %}
|
||||||
|
nil
|
||||||
|
{% elif metadata.type == "Array" and value %}
|
||||||
|
[{% for value in value %}
|
||||||
|
{% call valueBlock value metadata.element.items[forloop.counter0]|default:metadata.element %}
|
||||||
|
{{ ", " if not forloop.last }}
|
||||||
|
{% endfor %}]
|
||||||
|
{% elif metadata.type == "Dictionary" %}
|
||||||
|
[{% for key,value in value %}
|
||||||
|
"{{key}}": {% call valueBlock value metadata.properties[key] %}
|
||||||
|
{{ ", " if not forloop.last }}
|
||||||
|
{% empty %}
|
||||||
|
:
|
||||||
|
{% endfor %}]
|
||||||
|
{% elif metadata.type == "Bool" %}
|
||||||
|
{% if value %}true{% else %}false{% endif %}
|
||||||
|
{% else %}
|
||||||
|
{{ value }}
|
||||||
|
{% endif %}
|
||||||
|
{% endfilter %}{% endmacro %}
|
||||||
|
|
||||||
|
// swiftlint:disable identifier_name line_length number_separator type_body_length
|
||||||
|
{{accessModifier}} enum {{param.enumName|default:"JSONFiles"}} {
|
||||||
|
{% if files.count > 1 or param.forceFileNameEnum %}
|
||||||
|
{% for file in files %}
|
||||||
|
{{accessModifier}} enum {{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 number_separator type_body_length
|
||||||
|
{% else %}
|
||||||
|
// No files found
|
||||||
|
{% endif %}
|
|
@ -0,0 +1,112 @@
|
||||||
|
// 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: - JSON 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}} = objectFromJSON(at: "{% call transformPath file.path %}")
|
||||||
|
{% elif document.metadata.type == "Dictionary" %}
|
||||||
|
private static let _document = JSONDocument(path: "{% call transformPath file.path %}")
|
||||||
|
|
||||||
|
{% for key,value in document.metadata.properties %}
|
||||||
|
{{accessModifier}} {% call propertyBlock key value %}
|
||||||
|
{% endfor %}
|
||||||
|
{% else %}
|
||||||
|
{{accessModifier}} static let value: {{rootType}} = objectFromJSON(at: "{% call transformPath file.path %}")
|
||||||
|
{% endif %}
|
||||||
|
{% endmacro %}
|
||||||
|
{% macro typeBlock metadata %}{% filter removeNewlines:"leading" %}
|
||||||
|
{% if metadata.type == "Array" %}
|
||||||
|
[{% call typeBlock metadata.element %}]
|
||||||
|
{% elif metadata.type == "Dictionary" %}
|
||||||
|
[String: Any]
|
||||||
|
{% elif metadata.type == "Optional" %}
|
||||||
|
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
|
||||||
|
{{accessModifier}} enum {{param.enumName|default:"JSONFiles"}} {
|
||||||
|
{% if files.count > 1 or param.forceFileNameEnum %}
|
||||||
|
{% for file in files %}
|
||||||
|
{{accessModifier}} enum {{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 objectFromJSON<T>(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 json = try? JSONSerialization.jsonObject(with: Data(contentsOf: url), options: []),
|
||||||
|
let result = json as? T else {
|
||||||
|
fatalError("Unable to load JSON at path: \(path)")
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
private struct JSONDocument {
|
||||||
|
let data: [String: Any]
|
||||||
|
|
||||||
|
init(path: String) {
|
||||||
|
self.data = objectFromJSON(at: path)
|
||||||
|
}
|
||||||
|
|
||||||
|
subscript<T>(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 %}
|
|
@ -0,0 +1,112 @@
|
||||||
|
// 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: - JSON 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}} = objectFromJSON(at: "{% call transformPath file.path %}")
|
||||||
|
{% elif document.metadata.type == "Dictionary" %}
|
||||||
|
private static let _document = JSONDocument(path: "{% call transformPath file.path %}")
|
||||||
|
|
||||||
|
{% for key,value in document.metadata.properties %}
|
||||||
|
{{accessModifier}} {% call propertyBlock key value %}
|
||||||
|
{% endfor %}
|
||||||
|
{% else %}
|
||||||
|
{{accessModifier}} static let value: {{rootType}} = objectFromJSON(at: "{% call transformPath file.path %}")
|
||||||
|
{% endif %}
|
||||||
|
{% endmacro %}
|
||||||
|
{% macro typeBlock metadata %}{% filter removeNewlines:"leading" %}
|
||||||
|
{% if metadata.type == "Array" %}
|
||||||
|
[{% call typeBlock metadata.element %}]
|
||||||
|
{% elif metadata.type == "Dictionary" %}
|
||||||
|
[String: Any]
|
||||||
|
{% elif metadata.type == "Optional" %}
|
||||||
|
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
|
||||||
|
{{accessModifier}} enum {{param.enumName|default:"JSONFiles"}} {
|
||||||
|
{% if files.count > 1 or param.forceFileNameEnum %}
|
||||||
|
{% for file in files %}
|
||||||
|
{{accessModifier}} enum {{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 objectFromJSON<T>(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 json = try? JSONSerialization.jsonObject(with: Data(contentsOf: url), options: []),
|
||||||
|
let result = json as? T else {
|
||||||
|
fatalError("Unable to load JSON at path: \(path)")
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
private struct JSONDocument {
|
||||||
|
let data: [String: Any]
|
||||||
|
|
||||||
|
init(path: String) {
|
||||||
|
self.data = objectFromJSON(at: path)
|
||||||
|
}
|
||||||
|
|
||||||
|
subscript<T>(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 %}
|
|
@ -0,0 +1,82 @@
|
||||||
|
// 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}} = {% call valueBlock document.data document.metadata %}
|
||||||
|
{% elif document.metadata.type == "Dictionary" %}
|
||||||
|
{% for key,value in document.metadata.properties %}
|
||||||
|
{{accessModifier}} {% call propertyBlock key value document.data %}
|
||||||
|
{% endfor %}
|
||||||
|
{% else %}
|
||||||
|
{{accessModifier}} static let value: {{rootType}} = {% call valueBlock document.data document.metadata %}
|
||||||
|
{% 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 data %}{% filter removeNewlines:"leading" %}
|
||||||
|
{% set propertyName %}{{key|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}}{% endset %}
|
||||||
|
{% set propertyType %}{% call typeBlock metadata %}{% endset %}
|
||||||
|
static let {{propertyName}}: {{propertyType}} = {% call valueBlock data[key] metadata %}
|
||||||
|
{% endfilter %}{% endmacro %}
|
||||||
|
{% macro valueBlock value metadata %}{% filter removeNewlines:"leading" %}
|
||||||
|
{% if metadata.type == "String" %}
|
||||||
|
"{{ value }}"
|
||||||
|
{% elif metadata.type == "Date" %}
|
||||||
|
Date(timeIntervalSinceReferenceDate: {{ value.timeIntervalSinceReferenceDate }})
|
||||||
|
{% elif metadata.type == "Optional" %}
|
||||||
|
nil
|
||||||
|
{% elif metadata.type == "Array" and value %}
|
||||||
|
[{% for value in value %}
|
||||||
|
{% call valueBlock value metadata.element.items[forloop.counter0]|default:metadata.element %}
|
||||||
|
{{ ", " if not forloop.last }}
|
||||||
|
{% endfor %}]
|
||||||
|
{% elif metadata.type == "Dictionary" %}
|
||||||
|
[{% for key,value in value %}
|
||||||
|
"{{key}}": {% call valueBlock value metadata.properties[key] %}
|
||||||
|
{{ ", " if not forloop.last }}
|
||||||
|
{% empty %}
|
||||||
|
:
|
||||||
|
{% endfor %}]
|
||||||
|
{% elif metadata.type == "Bool" %}
|
||||||
|
{% if value %}true{% else %}false{% endif %}
|
||||||
|
{% else %}
|
||||||
|
{{ value }}
|
||||||
|
{% endif %}
|
||||||
|
{% endfilter %}{% endmacro %}
|
||||||
|
|
||||||
|
// swiftlint:disable identifier_name line_length number_separator type_body_length
|
||||||
|
{{accessModifier}} enum {{param.enumName|default:"PlistFiles"}} {
|
||||||
|
{% if files.count > 1 or param.forceFileNameEnum %}
|
||||||
|
{% for file in files %}
|
||||||
|
{{accessModifier}} enum {{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 number_separator type_body_length
|
||||||
|
{% else %}
|
||||||
|
// No files found
|
||||||
|
{% endif %}
|
|
@ -0,0 +1,82 @@
|
||||||
|
// 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}} = {% call valueBlock document.data document.metadata %}
|
||||||
|
{% elif document.metadata.type == "Dictionary" %}
|
||||||
|
{% for key,value in document.metadata.properties %}
|
||||||
|
{{accessModifier}} {% call propertyBlock key value document.data %}
|
||||||
|
{% endfor %}
|
||||||
|
{% else %}
|
||||||
|
{{accessModifier}} static let value: {{rootType}} = {% call valueBlock document.data document.metadata %}
|
||||||
|
{% 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 data %}{% filter removeNewlines:"leading" %}
|
||||||
|
{% set propertyName %}{{key|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}}{% endset %}
|
||||||
|
{% set propertyType %}{% call typeBlock metadata %}{% endset %}
|
||||||
|
static let {{propertyName}}: {{propertyType}} = {% call valueBlock data[key] metadata %}
|
||||||
|
{% endfilter %}{% endmacro %}
|
||||||
|
{% macro valueBlock value metadata %}{% filter removeNewlines:"leading" %}
|
||||||
|
{% if metadata.type == "String" %}
|
||||||
|
"{{ value }}"
|
||||||
|
{% elif metadata.type == "Date" %}
|
||||||
|
Date(timeIntervalSinceReferenceDate: {{ value.timeIntervalSinceReferenceDate }})
|
||||||
|
{% elif metadata.type == "Optional" %}
|
||||||
|
nil
|
||||||
|
{% elif metadata.type == "Array" and value %}
|
||||||
|
[{% for value in value %}
|
||||||
|
{% call valueBlock value metadata.element.items[forloop.counter0]|default:metadata.element %}
|
||||||
|
{{ ", " if not forloop.last }}
|
||||||
|
{% endfor %}]
|
||||||
|
{% elif metadata.type == "Dictionary" %}
|
||||||
|
[{% for key,value in value %}
|
||||||
|
"{{key}}": {% call valueBlock value metadata.properties[key] %}
|
||||||
|
{{ ", " if not forloop.last }}
|
||||||
|
{% empty %}
|
||||||
|
:
|
||||||
|
{% endfor %}]
|
||||||
|
{% elif metadata.type == "Bool" %}
|
||||||
|
{% if value %}true{% else %}false{% endif %}
|
||||||
|
{% else %}
|
||||||
|
{{ value }}
|
||||||
|
{% endif %}
|
||||||
|
{% endfilter %}{% endmacro %}
|
||||||
|
|
||||||
|
// swiftlint:disable identifier_name line_length number_separator type_body_length
|
||||||
|
{{accessModifier}} enum {{param.enumName|default:"PlistFiles"}} {
|
||||||
|
{% if files.count > 1 or param.forceFileNameEnum %}
|
||||||
|
{% for file in files %}
|
||||||
|
{{accessModifier}} enum {{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 number_separator type_body_length
|
||||||
|
{% else %}
|
||||||
|
// No files found
|
||||||
|
{% endif %}
|
|
@ -0,0 +1,117 @@
|
||||||
|
// 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
|
||||||
|
{{accessModifier}} enum {{param.enumName|default:"PlistFiles"}} {
|
||||||
|
{% if files.count > 1 or param.forceFileNameEnum %}
|
||||||
|
{% for file in files %}
|
||||||
|
{{accessModifier}} enum {{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<T>(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<T>(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 %}
|
|
@ -0,0 +1,117 @@
|
||||||
|
// 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
|
||||||
|
{{accessModifier}} enum {{param.enumName|default:"PlistFiles"}} {
|
||||||
|
{% if files.count > 1 or param.forceFileNameEnum %}
|
||||||
|
{% for file in files %}
|
||||||
|
{{accessModifier}} enum {{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<T>(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<T>(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 %}
|
|
@ -0,0 +1,99 @@
|
||||||
|
// swiftlint:disable all
|
||||||
|
// Generated using SwiftGen — https://github.com/SwiftGen/SwiftGen
|
||||||
|
|
||||||
|
{% if tables.count > 0 %}
|
||||||
|
{% set accessModifier %}{% if param.publicAccess %}public{% else %}internal{% endif %}{% endset %}
|
||||||
|
import Foundation
|
||||||
|
|
||||||
|
// swiftlint:disable superfluous_disable_command file_length implicit_return
|
||||||
|
|
||||||
|
// MARK: - Strings
|
||||||
|
|
||||||
|
{% macro parametersBlock types %}{% filter removeNewlines:"leading" %}
|
||||||
|
{% for type in types %}
|
||||||
|
{% if type == "String" %}
|
||||||
|
_ p{{forloop.counter}}: Any
|
||||||
|
{% else %}
|
||||||
|
_ p{{forloop.counter}}: {{type}}
|
||||||
|
{% endif %}
|
||||||
|
{{ ", " if not forloop.last }}
|
||||||
|
{% endfor %}
|
||||||
|
{% endfilter %}{% endmacro %}
|
||||||
|
{% macro argumentsBlock types %}{% filter removeNewlines:"leading" %}
|
||||||
|
{% for type in types %}
|
||||||
|
{% if type == "String" %}
|
||||||
|
String(describing: p{{forloop.counter}})
|
||||||
|
{% elif type == "UnsafeRawPointer" %}
|
||||||
|
Int(bitPattern: p{{forloop.counter}})
|
||||||
|
{% else %}
|
||||||
|
p{{forloop.counter}}
|
||||||
|
{% endif %}
|
||||||
|
{{ ", " if not forloop.last }}
|
||||||
|
{% endfor %}
|
||||||
|
{% endfilter %}{% endmacro %}
|
||||||
|
{% macro recursiveBlock table item %}
|
||||||
|
{% for string in item.strings %}
|
||||||
|
{% if not param.noComments %}
|
||||||
|
{% for line in string.translation|split:"\n" %}
|
||||||
|
/// {{line}}
|
||||||
|
{% endfor %}
|
||||||
|
{% endif %}
|
||||||
|
{% if string.types %}
|
||||||
|
{{accessModifier}} static func {{string.key|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}}({% call parametersBlock string.types %}) -> String {
|
||||||
|
return {{enumName}}.tr("{{table}}", "{{string.key}}", {% call argumentsBlock string.types %})
|
||||||
|
}
|
||||||
|
{% elif param.lookupFunction %}
|
||||||
|
{# custom localization function is mostly used for in-app lang selection, so we want the loc to be recomputed at each call for those (hence the computed var) #}
|
||||||
|
{{accessModifier}} static var {{string.key|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}}: String { return {{enumName}}.tr("{{table}}", "{{string.key}}") }
|
||||||
|
{% else %}
|
||||||
|
{{accessModifier}} static let {{string.key|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}} = {{enumName}}.tr("{{table}}", "{{string.key}}")
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
{% for child in item.children %}
|
||||||
|
{% call recursiveBlock table child %}
|
||||||
|
{% endfor %}
|
||||||
|
{% endmacro %}
|
||||||
|
// swiftlint:disable function_parameter_count identifier_name line_length type_body_length
|
||||||
|
{% set enumName %}{{param.enumName|default:"L10n"}}{% endset %}
|
||||||
|
{{accessModifier}} enum {{enumName}} {
|
||||||
|
{% if tables.count > 1 or param.forceFileNameEnum %}
|
||||||
|
{% for table in tables %}
|
||||||
|
{{accessModifier}} enum {{table.name|swiftIdentifier:"pretty"|escapeReservedKeywords}} {
|
||||||
|
{% filter indent:2 %}{% call recursiveBlock table.name table.levels %}{% endfilter %}
|
||||||
|
}
|
||||||
|
{% endfor %}
|
||||||
|
{% else %}
|
||||||
|
{% call recursiveBlock tables.first.name tables.first.levels %}
|
||||||
|
{% endif %}
|
||||||
|
}
|
||||||
|
// swiftlint:enable function_parameter_count identifier_name line_length type_body_length
|
||||||
|
|
||||||
|
// MARK: - Implementation Details
|
||||||
|
|
||||||
|
extension {{enumName}} {
|
||||||
|
private static func tr(_ table: String, _ key: String, _ args: CVarArg...) -> String {
|
||||||
|
{% if param.lookupFunction %}
|
||||||
|
let format = {{ param.lookupFunction }}(key, table)
|
||||||
|
{% else %}
|
||||||
|
let format = {{param.bundle|default:"BundleToken.bundle"}}.localizedString(forKey: key, value: nil, table: table)
|
||||||
|
{% endif %}
|
||||||
|
return String(format: format, locale: Locale.current, arguments: args)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
{% 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 string found
|
||||||
|
{% endif %}
|
|
@ -0,0 +1,99 @@
|
||||||
|
// swiftlint:disable all
|
||||||
|
// Generated using SwiftGen — https://github.com/SwiftGen/SwiftGen
|
||||||
|
|
||||||
|
{% if tables.count > 0 %}
|
||||||
|
{% set accessModifier %}{% if param.publicAccess %}public{% else %}internal{% endif %}{% endset %}
|
||||||
|
import Foundation
|
||||||
|
|
||||||
|
// swiftlint:disable superfluous_disable_command file_length implicit_return
|
||||||
|
|
||||||
|
// MARK: - Strings
|
||||||
|
|
||||||
|
{% macro parametersBlock types %}{% filter removeNewlines:"leading" %}
|
||||||
|
{% for type in types %}
|
||||||
|
{% if type == "String" %}
|
||||||
|
_ p{{forloop.counter}}: Any
|
||||||
|
{% else %}
|
||||||
|
_ p{{forloop.counter}}: {{type}}
|
||||||
|
{% endif %}
|
||||||
|
{{ ", " if not forloop.last }}
|
||||||
|
{% endfor %}
|
||||||
|
{% endfilter %}{% endmacro %}
|
||||||
|
{% macro argumentsBlock types %}{% filter removeNewlines:"leading" %}
|
||||||
|
{% for type in types %}
|
||||||
|
{% if type == "String" %}
|
||||||
|
String(describing: p{{forloop.counter}})
|
||||||
|
{% elif type == "UnsafeRawPointer" %}
|
||||||
|
Int(bitPattern: p{{forloop.counter}})
|
||||||
|
{% else %}
|
||||||
|
p{{forloop.counter}}
|
||||||
|
{% endif %}
|
||||||
|
{{ ", " if not forloop.last }}
|
||||||
|
{% endfor %}
|
||||||
|
{% endfilter %}{% endmacro %}
|
||||||
|
{% macro recursiveBlock table item %}
|
||||||
|
{% for string in item.strings %}
|
||||||
|
{% if not param.noComments %}
|
||||||
|
{% for line in string.translation|split:"\n" %}
|
||||||
|
/// {{line}}
|
||||||
|
{% endfor %}
|
||||||
|
{% endif %}
|
||||||
|
{% if string.types %}
|
||||||
|
{{accessModifier}} static func {{string.key|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}}({% call parametersBlock string.types %}) -> String {
|
||||||
|
return {{enumName}}.tr("{{table}}", "{{string.key}}", {% call argumentsBlock string.types %})
|
||||||
|
}
|
||||||
|
{% elif param.lookupFunction %}
|
||||||
|
{# custom localization function is mostly used for in-app lang selection, so we want the loc to be recomputed at each call for those (hence the computed var) #}
|
||||||
|
{{accessModifier}} static var {{string.key|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}}: String { return {{enumName}}.tr("{{table}}", "{{string.key}}") }
|
||||||
|
{% else %}
|
||||||
|
{{accessModifier}} static let {{string.key|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}} = {{enumName}}.tr("{{table}}", "{{string.key}}")
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
{% for child in item.children %}
|
||||||
|
{% call recursiveBlock table child %}
|
||||||
|
{% endfor %}
|
||||||
|
{% endmacro %}
|
||||||
|
// swiftlint:disable function_parameter_count identifier_name line_length type_body_length
|
||||||
|
{% set enumName %}{{param.enumName|default:"L10n"}}{% endset %}
|
||||||
|
{{accessModifier}} enum {{enumName}} {
|
||||||
|
{% if tables.count > 1 or param.forceFileNameEnum %}
|
||||||
|
{% for table in tables %}
|
||||||
|
{{accessModifier}} enum {{table.name|swiftIdentifier:"pretty"|escapeReservedKeywords}} {
|
||||||
|
{% filter indent:2 %}{% call recursiveBlock table.name table.levels %}{% endfilter %}
|
||||||
|
}
|
||||||
|
{% endfor %}
|
||||||
|
{% else %}
|
||||||
|
{% call recursiveBlock tables.first.name tables.first.levels %}
|
||||||
|
{% endif %}
|
||||||
|
}
|
||||||
|
// swiftlint:enable function_parameter_count identifier_name line_length type_body_length
|
||||||
|
|
||||||
|
// MARK: - Implementation Details
|
||||||
|
|
||||||
|
extension {{enumName}} {
|
||||||
|
private static func tr(_ table: String, _ key: String, _ args: CVarArg...) -> String {
|
||||||
|
{% if param.lookupFunction %}
|
||||||
|
let format = {{ param.lookupFunction }}(key, table)
|
||||||
|
{% else %}
|
||||||
|
let format = {{param.bundle|default:"BundleToken.bundle"}}.localizedString(forKey: key, value: nil, table: table)
|
||||||
|
{% endif %}
|
||||||
|
return String(format: format, locale: Locale.current, arguments: args)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
{% 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 string found
|
||||||
|
{% endif %}
|
|
@ -0,0 +1,68 @@
|
||||||
|
// Generated using SwiftGen — https://github.com/SwiftGen/SwiftGen
|
||||||
|
|
||||||
|
{% if tables.count > 0 %}
|
||||||
|
#import <Foundation/Foundation.h>
|
||||||
|
|
||||||
|
NS_ASSUME_NONNULL_BEGIN
|
||||||
|
|
||||||
|
{% macro parametersBlock types %}{% filter removeNewlines:"leading" %}
|
||||||
|
{% for type in types %}
|
||||||
|
({% call paramTranslate type %})p{{ forloop.counter }}{{ " :" if not forloop.last }}
|
||||||
|
{% endfor %}
|
||||||
|
{% endfilter %}{% endmacro %}
|
||||||
|
{% macro argumentsBlock types %}{% filter removeNewlines:"leading" %}
|
||||||
|
{% for type in types %}
|
||||||
|
p{{forloop.counter}}{{ ", " if not forloop.last }}
|
||||||
|
{% endfor %}
|
||||||
|
{% endfilter %}{% endmacro %}
|
||||||
|
{% macro paramTranslate swiftType %}
|
||||||
|
{% if swiftType == "Any" %}
|
||||||
|
id
|
||||||
|
{% elif swiftType == "CChar" %}
|
||||||
|
char
|
||||||
|
{% elif swiftType == "Float" %}
|
||||||
|
float
|
||||||
|
{% elif swiftType == "Int" %}
|
||||||
|
NSInteger
|
||||||
|
{% elif swiftType == "String" %}
|
||||||
|
id
|
||||||
|
{% elif swiftType == "UnsafePointer<CChar>" %}
|
||||||
|
char*
|
||||||
|
{% elif swiftType == "UnsafeRawPointer" %}
|
||||||
|
void*
|
||||||
|
{% else %}
|
||||||
|
objc-h.stencil is missing '{{swiftType}}'
|
||||||
|
{% endif %}
|
||||||
|
{% endmacro %}
|
||||||
|
{% macro emitOneMethod table item %}
|
||||||
|
{% for string in item.strings %}
|
||||||
|
{% if not param.noComments %}
|
||||||
|
{% for line in string.translation|split:"\n" %}
|
||||||
|
/// {{line}}
|
||||||
|
{% endfor %}
|
||||||
|
{% endif %}
|
||||||
|
{% if string.types %}
|
||||||
|
{% if string.types.count == 1 %}
|
||||||
|
+ (NSString*){{string.key|swiftIdentifier:"pretty"|lowerFirstWord}}WithValue:{% call parametersBlock string.types %};
|
||||||
|
{% else %}
|
||||||
|
+ (NSString*){{string.key|swiftIdentifier:"pretty"|lowerFirstWord}}WithValues:{% call parametersBlock string.types %};
|
||||||
|
{% endif %}
|
||||||
|
{% else %}
|
||||||
|
+ (NSString*){{string.key|swiftIdentifier:"pretty"|lowerFirstWord}};
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
{% for child in item.children %}
|
||||||
|
{% call emitOneMethod table child %}
|
||||||
|
{% endfor %}
|
||||||
|
{% endmacro %}
|
||||||
|
{% for table in tables %}
|
||||||
|
@interface {{ table.name }} : NSObject
|
||||||
|
{% call emitOneMethod table.name table.levels %}
|
||||||
|
@end
|
||||||
|
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
NS_ASSUME_NONNULL_END
|
||||||
|
{% else %}
|
||||||
|
// No strings found
|
||||||
|
{% endif %}
|
|
@ -0,0 +1,90 @@
|
||||||
|
// Generated using SwiftGen — https://github.com/SwiftGen/SwiftGen
|
||||||
|
|
||||||
|
{% if tables.count > 0 %}
|
||||||
|
#import "{{ param.headerName|default:"Localizable.h" }}"
|
||||||
|
{% if not param.bundle %}
|
||||||
|
|
||||||
|
@interface BundleToken : NSObject
|
||||||
|
@end
|
||||||
|
|
||||||
|
@implementation BundleToken
|
||||||
|
@end
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
#pragma clang diagnostic push
|
||||||
|
#pragma clang diagnostic ignored "-Wformat-security"
|
||||||
|
|
||||||
|
static NSString* tr(NSString *tableName, NSString *key, ...) {
|
||||||
|
NSBundle *bundle = {{param.bundle|default:"[NSBundle bundleForClass:BundleToken.class]"}};
|
||||||
|
NSString *format = [bundle localizedStringForKey:key value:nil table:tableName];
|
||||||
|
NSLocale *locale = [NSLocale currentLocale];
|
||||||
|
|
||||||
|
va_list args;
|
||||||
|
va_start(args, key);
|
||||||
|
NSString *result = [[NSString alloc] initWithFormat:format locale:locale arguments:args];
|
||||||
|
va_end(args);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
};
|
||||||
|
#pragma clang diagnostic pop
|
||||||
|
|
||||||
|
{% macro parametersBlock types %}{% filter removeNewlines:"leading" %}
|
||||||
|
{% for type in types %}
|
||||||
|
({% call paramTranslate type %})p{{ forloop.counter }}{{ " :" if not forloop.last }}
|
||||||
|
{% endfor %}
|
||||||
|
{% endfilter %}{% endmacro %}
|
||||||
|
{% macro argumentsBlock types %}{% filter removeNewlines:"leading" %}
|
||||||
|
{% for type in types %}
|
||||||
|
p{{forloop.counter}}{{ ", " if not forloop.last }}
|
||||||
|
{% endfor %}
|
||||||
|
{% endfilter %}{% endmacro %}
|
||||||
|
{% macro paramTranslate swiftType %}
|
||||||
|
{% if swiftType == "Any" %}
|
||||||
|
id
|
||||||
|
{% elif swiftType == "CChar" %}
|
||||||
|
char
|
||||||
|
{% elif swiftType == "Float" %}
|
||||||
|
float
|
||||||
|
{% elif swiftType == "Int" %}
|
||||||
|
NSInteger
|
||||||
|
{% elif swiftType == "String" %}
|
||||||
|
id
|
||||||
|
{% elif swiftType == "UnsafePointer<CChar>" %}
|
||||||
|
char*
|
||||||
|
{% elif swiftType == "UnsafeRawPointer" %}
|
||||||
|
void*
|
||||||
|
{% else %}
|
||||||
|
objc-m.stencil is missing '{{swiftType}}'
|
||||||
|
{% endif %}
|
||||||
|
{% endmacro %}
|
||||||
|
{% macro tableContents table item %}
|
||||||
|
{% for string in item.strings %}
|
||||||
|
{% if string.types %}
|
||||||
|
{% if string.types.count == 1 %}
|
||||||
|
+ (NSString*){{string.key|swiftIdentifier:"pretty"|lowerFirstWord}}WithValue:{% call parametersBlock string.types %}
|
||||||
|
{% else %}
|
||||||
|
+ (NSString*){{string.key|swiftIdentifier:"pretty"|lowerFirstWord}}WithValues:{% call parametersBlock string.types %}
|
||||||
|
{% endif %}
|
||||||
|
{
|
||||||
|
return tr(@"{{table}}", @"{{string.key}}", {% call argumentsBlock string.types %});
|
||||||
|
}
|
||||||
|
{% else %}
|
||||||
|
+ (NSString*){{string.key|swiftIdentifier:"pretty"|lowerFirstWord}} {
|
||||||
|
return tr(@"{{table}}", @"{{string.key}}");
|
||||||
|
}
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
{% for child in item.children %}
|
||||||
|
{% call tableContents table child %}
|
||||||
|
{% endfor %}
|
||||||
|
{% endmacro %}
|
||||||
|
{% for table in tables %}
|
||||||
|
{% set tableName %}{{table.name|default:"Localized"}}{% endset %}
|
||||||
|
@implementation {{ tableName }} : NSObject
|
||||||
|
{% call tableContents table.name table.levels %}
|
||||||
|
@end
|
||||||
|
|
||||||
|
{% endfor %}
|
||||||
|
{% else %}
|
||||||
|
// No strings found
|
||||||
|
{% endif %}
|
|
@ -0,0 +1,104 @@
|
||||||
|
// swiftlint:disable all
|
||||||
|
// Generated using SwiftGen — https://github.com/SwiftGen/SwiftGen
|
||||||
|
|
||||||
|
{% if tables.count > 0 %}
|
||||||
|
{% set accessModifier %}{% if param.publicAccess %}public{% else %}internal{% endif %}{% endset %}
|
||||||
|
import Foundation
|
||||||
|
|
||||||
|
// swiftlint:disable superfluous_disable_command file_length implicit_return
|
||||||
|
|
||||||
|
// MARK: - Strings
|
||||||
|
|
||||||
|
{% macro parametersBlock types %}{% filter removeNewlines:"leading" %}
|
||||||
|
{% for type in types %}
|
||||||
|
{% if type == "String" %}
|
||||||
|
_ p{{forloop.counter}}: Any
|
||||||
|
{% else %}
|
||||||
|
_ p{{forloop.counter}}: {{type}}
|
||||||
|
{% endif %}
|
||||||
|
{{ ", " if not forloop.last }}
|
||||||
|
{% endfor %}
|
||||||
|
{% endfilter %}{% endmacro %}
|
||||||
|
{% macro argumentsBlock types %}{% filter removeNewlines:"leading" %}
|
||||||
|
{% for type in types %}
|
||||||
|
{% if type == "String" %}
|
||||||
|
String(describing: p{{forloop.counter}})
|
||||||
|
{% elif type == "UnsafeRawPointer" %}
|
||||||
|
Int(bitPattern: p{{forloop.counter}})
|
||||||
|
{% else %}
|
||||||
|
p{{forloop.counter}}
|
||||||
|
{% endif %}
|
||||||
|
{{ ", " if not forloop.last }}
|
||||||
|
{% endfor %}
|
||||||
|
{% endfilter %}{% endmacro %}
|
||||||
|
{% macro recursiveBlock table item %}
|
||||||
|
{% for string in item.strings %}
|
||||||
|
{% if not param.noComments %}
|
||||||
|
{% for line in string.translation|split:"\n" %}
|
||||||
|
/// {{line}}
|
||||||
|
{% endfor %}
|
||||||
|
{% endif %}
|
||||||
|
{% if string.types %}
|
||||||
|
{{accessModifier}} static func {{string.name|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}}({% call parametersBlock string.types %}) -> String {
|
||||||
|
return {{enumName}}.tr("{{table}}", "{{string.key}}", {% call argumentsBlock string.types %})
|
||||||
|
}
|
||||||
|
{% elif param.lookupFunction %}
|
||||||
|
{# custom localization function is mostly used for in-app lang selection, so we want the loc to be recomputed at each call for those (hence the computed var) #}
|
||||||
|
{{accessModifier}} static var {{string.name|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}}: String { return {{enumName}}.tr("{{table}}", "{{string.key}}") }
|
||||||
|
{% else %}
|
||||||
|
{{accessModifier}} static let {{string.name|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}} = {{enumName}}.tr("{{table}}", "{{string.key}}")
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
{% for child in item.children %}
|
||||||
|
|
||||||
|
{{accessModifier}} enum {{child.name|swiftIdentifier:"pretty"|escapeReservedKeywords}} {
|
||||||
|
{% filter indent:2 %}{% call recursiveBlock table child %}{% endfilter %}
|
||||||
|
}
|
||||||
|
{% endfor %}
|
||||||
|
{% endmacro %}
|
||||||
|
// swiftlint:disable explicit_type_interface function_parameter_count identifier_name line_length
|
||||||
|
// swiftlint:disable nesting type_body_length type_name vertical_whitespace_opening_braces
|
||||||
|
{% set enumName %}{{param.enumName|default:"L10n"}}{% endset %}
|
||||||
|
{{accessModifier}} enum {{enumName}} {
|
||||||
|
{% if tables.count > 1 or param.forceFileNameEnum %}
|
||||||
|
{% for table in tables %}
|
||||||
|
{{accessModifier}} enum {{table.name|swiftIdentifier:"pretty"|escapeReservedKeywords}} {
|
||||||
|
{% filter indent:2 %}{% call recursiveBlock table.name table.levels %}{% endfilter %}
|
||||||
|
}
|
||||||
|
{% endfor %}
|
||||||
|
{% else %}
|
||||||
|
{% call recursiveBlock tables.first.name tables.first.levels %}
|
||||||
|
{% endif %}
|
||||||
|
}
|
||||||
|
// swiftlint:enable explicit_type_interface function_parameter_count identifier_name line_length
|
||||||
|
// swiftlint:enable nesting type_body_length type_name vertical_whitespace_opening_braces
|
||||||
|
|
||||||
|
// MARK: - Implementation Details
|
||||||
|
|
||||||
|
extension {{enumName}} {
|
||||||
|
private static func tr(_ table: String, _ key: String, _ args: CVarArg...) -> String {
|
||||||
|
{% if param.lookupFunction %}
|
||||||
|
let format = {{ param.lookupFunction }}(key, table)
|
||||||
|
{% else %}
|
||||||
|
let format = {{param.bundle|default:"BundleToken.bundle"}}.localizedString(forKey: key, value: nil, table: table)
|
||||||
|
{% endif %}
|
||||||
|
return String(format: format, locale: Locale.current, arguments: args)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
{% 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 string found
|
||||||
|
{% endif %}
|
|
@ -0,0 +1,104 @@
|
||||||
|
// swiftlint:disable all
|
||||||
|
// Generated using SwiftGen — https://github.com/SwiftGen/SwiftGen
|
||||||
|
|
||||||
|
{% if tables.count > 0 %}
|
||||||
|
{% set accessModifier %}{% if param.publicAccess %}public{% else %}internal{% endif %}{% endset %}
|
||||||
|
import Foundation
|
||||||
|
|
||||||
|
// swiftlint:disable superfluous_disable_command file_length implicit_return
|
||||||
|
|
||||||
|
// MARK: - Strings
|
||||||
|
|
||||||
|
{% macro parametersBlock types %}{% filter removeNewlines:"leading" %}
|
||||||
|
{% for type in types %}
|
||||||
|
{% if type == "String" %}
|
||||||
|
_ p{{forloop.counter}}: Any
|
||||||
|
{% else %}
|
||||||
|
_ p{{forloop.counter}}: {{type}}
|
||||||
|
{% endif %}
|
||||||
|
{{ ", " if not forloop.last }}
|
||||||
|
{% endfor %}
|
||||||
|
{% endfilter %}{% endmacro %}
|
||||||
|
{% macro argumentsBlock types %}{% filter removeNewlines:"leading" %}
|
||||||
|
{% for type in types %}
|
||||||
|
{% if type == "String" %}
|
||||||
|
String(describing: p{{forloop.counter}})
|
||||||
|
{% elif type == "UnsafeRawPointer" %}
|
||||||
|
Int(bitPattern: p{{forloop.counter}})
|
||||||
|
{% else %}
|
||||||
|
p{{forloop.counter}}
|
||||||
|
{% endif %}
|
||||||
|
{{ ", " if not forloop.last }}
|
||||||
|
{% endfor %}
|
||||||
|
{% endfilter %}{% endmacro %}
|
||||||
|
{% macro recursiveBlock table item %}
|
||||||
|
{% for string in item.strings %}
|
||||||
|
{% if not param.noComments %}
|
||||||
|
{% for line in string.translation|split:"\n" %}
|
||||||
|
/// {{line}}
|
||||||
|
{% endfor %}
|
||||||
|
{% endif %}
|
||||||
|
{% if string.types %}
|
||||||
|
{{accessModifier}} static func {{string.name|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}}({% call parametersBlock string.types %}) -> String {
|
||||||
|
return {{enumName}}.tr("{{table}}", "{{string.key}}", {% call argumentsBlock string.types %})
|
||||||
|
}
|
||||||
|
{% elif param.lookupFunction %}
|
||||||
|
{# custom localization function is mostly used for in-app lang selection, so we want the loc to be recomputed at each call for those (hence the computed var) #}
|
||||||
|
{{accessModifier}} static var {{string.name|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}}: String { return {{enumName}}.tr("{{table}}", "{{string.key}}") }
|
||||||
|
{% else %}
|
||||||
|
{{accessModifier}} static let {{string.name|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}} = {{enumName}}.tr("{{table}}", "{{string.key}}")
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
{% for child in item.children %}
|
||||||
|
|
||||||
|
{{accessModifier}} enum {{child.name|swiftIdentifier:"pretty"|escapeReservedKeywords}} {
|
||||||
|
{% filter indent:2 %}{% call recursiveBlock table child %}{% endfilter %}
|
||||||
|
}
|
||||||
|
{% endfor %}
|
||||||
|
{% endmacro %}
|
||||||
|
// swiftlint:disable explicit_type_interface function_parameter_count identifier_name line_length
|
||||||
|
// swiftlint:disable nesting type_body_length type_name vertical_whitespace_opening_braces
|
||||||
|
{% set enumName %}{{param.enumName|default:"L10n"}}{% endset %}
|
||||||
|
{{accessModifier}} enum {{enumName}} {
|
||||||
|
{% if tables.count > 1 or param.forceFileNameEnum %}
|
||||||
|
{% for table in tables %}
|
||||||
|
{{accessModifier}} enum {{table.name|swiftIdentifier:"pretty"|escapeReservedKeywords}} {
|
||||||
|
{% filter indent:2 %}{% call recursiveBlock table.name table.levels %}{% endfilter %}
|
||||||
|
}
|
||||||
|
{% endfor %}
|
||||||
|
{% else %}
|
||||||
|
{% call recursiveBlock tables.first.name tables.first.levels %}
|
||||||
|
{% endif %}
|
||||||
|
}
|
||||||
|
// swiftlint:enable explicit_type_interface function_parameter_count identifier_name line_length
|
||||||
|
// swiftlint:enable nesting type_body_length type_name vertical_whitespace_opening_braces
|
||||||
|
|
||||||
|
// MARK: - Implementation Details
|
||||||
|
|
||||||
|
extension {{enumName}} {
|
||||||
|
private static func tr(_ table: String, _ key: String, _ args: CVarArg...) -> String {
|
||||||
|
{% if param.lookupFunction %}
|
||||||
|
let format = {{ param.lookupFunction }}(key, table)
|
||||||
|
{% else %}
|
||||||
|
let format = {{param.bundle|default:"BundleToken.bundle"}}.localizedString(forKey: key, value: nil, table: table)
|
||||||
|
{% endif %}
|
||||||
|
return String(format: format, locale: Locale.current, arguments: args)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
{% 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 string found
|
||||||
|
{% endif %}
|
|
@ -0,0 +1,329 @@
|
||||||
|
// swiftlint:disable all
|
||||||
|
// Generated using SwiftGen — https://github.com/SwiftGen/SwiftGen
|
||||||
|
|
||||||
|
{% if catalogs %}
|
||||||
|
{% set enumName %}{{param.enumName|default:"Asset"}}{% endset %}
|
||||||
|
{% set arResourceGroupType %}{{param.arResourceGroupTypeName|default:"ARResourceGroupAsset"}}{% endset %}
|
||||||
|
{% set colorType %}{{param.colorTypeName|default:"ColorAsset"}}{% endset %}
|
||||||
|
{% set dataType %}{{param.dataTypeName|default:"DataAsset"}}{% endset %}
|
||||||
|
{% set imageType %}{{param.imageTypeName|default:"ImageAsset"}}{% endset %}
|
||||||
|
{% set symbolType %}{{param.symbolTypeName|default:"SymbolAsset"}}{% endset %}
|
||||||
|
{% set forceNamespaces %}{{param.forceProvidesNamespaces|default:"false"}}{% endset %}
|
||||||
|
{% set accessModifier %}{% if param.publicAccess %}public{% else %}internal{% endif %}{% endset %}
|
||||||
|
#if os(macOS)
|
||||||
|
import AppKit
|
||||||
|
#elseif os(iOS)
|
||||||
|
{% if resourceCount.arresourcegroup > 0 %}
|
||||||
|
import ARKit
|
||||||
|
{% endif %}
|
||||||
|
import UIKit
|
||||||
|
#elseif os(tvOS) || os(watchOS)
|
||||||
|
import UIKit
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Deprecated typealiases
|
||||||
|
{% if resourceCount.color > 0 %}
|
||||||
|
@available(*, deprecated, renamed: "{{colorType}}.Color", message: "This typealias will be removed in SwiftGen 7.0")
|
||||||
|
{{accessModifier}} typealias {{param.colorAliasName|default:"AssetColorTypeAlias"}} = {{colorType}}.Color
|
||||||
|
{% endif %}
|
||||||
|
{% if resourceCount.image > 0 %}
|
||||||
|
@available(*, deprecated, renamed: "{{imageType}}.Image", message: "This typealias will be removed in SwiftGen 7.0")
|
||||||
|
{{accessModifier}} typealias {{param.imageAliasName|default:"AssetImageTypeAlias"}} = {{imageType}}.Image
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
// swiftlint:disable superfluous_disable_command file_length implicit_return
|
||||||
|
|
||||||
|
// MARK: - Asset Catalogs
|
||||||
|
|
||||||
|
{% macro enumBlock assets %}
|
||||||
|
{% call casesBlock assets %}
|
||||||
|
{% if param.allValues %}
|
||||||
|
|
||||||
|
// swiftlint:disable trailing_comma
|
||||||
|
{% if resourceCount.arresourcegroup > 0 %}
|
||||||
|
{{accessModifier}} static let allResourceGroups: [{{arResourceGroupType}}] = [
|
||||||
|
{% filter indent:2 %}{% call allValuesBlock assets "arresourcegroup" "" %}{% endfilter %}
|
||||||
|
]
|
||||||
|
{% endif %}
|
||||||
|
{% if resourceCount.color > 0 %}
|
||||||
|
{{accessModifier}} static let allColors: [{{colorType}}] = [
|
||||||
|
{% filter indent:2 %}{% call allValuesBlock assets "color" "" %}{% endfilter %}
|
||||||
|
]
|
||||||
|
{% endif %}
|
||||||
|
{% if resourceCount.data > 0 %}
|
||||||
|
{{accessModifier}} static let allDataAssets: [{{dataType}}] = [
|
||||||
|
{% filter indent:2 %}{% call allValuesBlock assets "data" "" %}{% endfilter %}
|
||||||
|
]
|
||||||
|
{% endif %}
|
||||||
|
{% if resourceCount.image > 0 %}
|
||||||
|
{{accessModifier}} static let allImages: [{{imageType}}] = [
|
||||||
|
{% filter indent:2 %}{% call allValuesBlock assets "image" "" %}{% endfilter %}
|
||||||
|
]
|
||||||
|
{% endif %}
|
||||||
|
{% if resourceCount.symbol > 0 %}
|
||||||
|
{{accessModifier}} static let allSymbols: [{{symbolType}}] = [
|
||||||
|
{% filter indent:2 %}{% call allValuesBlock assets "symbol" "" %}{% endfilter %}
|
||||||
|
]
|
||||||
|
{% endif %}
|
||||||
|
// swiftlint:enable trailing_comma
|
||||||
|
{% endif %}
|
||||||
|
{% endmacro %}
|
||||||
|
{% macro casesBlock assets %}
|
||||||
|
{% for asset in assets %}
|
||||||
|
{% if asset.type == "arresourcegroup" %}
|
||||||
|
{{accessModifier}} static let {{asset.name|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}} = {{arResourceGroupType}}(name: "{{asset.value}}")
|
||||||
|
{% elif asset.type == "color" %}
|
||||||
|
{{accessModifier}} static let {{asset.name|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}} = {{colorType}}(name: "{{asset.value}}")
|
||||||
|
{% elif asset.type == "data" %}
|
||||||
|
{{accessModifier}} static let {{asset.name|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}} = {{dataType}}(name: "{{asset.value}}")
|
||||||
|
{% elif asset.type == "image" %}
|
||||||
|
{{accessModifier}} static let {{asset.name|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}} = {{imageType}}(name: "{{asset.value}}")
|
||||||
|
{% elif asset.type == "symbol" %}
|
||||||
|
{{accessModifier}} static let {{asset.name|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}} = {{symbolType}}(name: "{{asset.value}}")
|
||||||
|
{% elif asset.items and ( forceNamespaces == "true" or asset.isNamespaced == "true" ) %}
|
||||||
|
{{accessModifier}} enum {{asset.name|swiftIdentifier:"pretty"|escapeReservedKeywords}} {
|
||||||
|
{% filter indent:2 %}{% call casesBlock asset.items %}{% endfilter %}
|
||||||
|
}
|
||||||
|
{% elif asset.items %}
|
||||||
|
{% call casesBlock asset.items %}
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
{% endmacro %}
|
||||||
|
{% macro allValuesBlock assets filter prefix %}
|
||||||
|
{% for asset in assets %}
|
||||||
|
{% if asset.type == filter %}
|
||||||
|
{{prefix}}{{asset.name|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}},
|
||||||
|
{% elif asset.items and ( forceNamespaces == "true" or asset.isNamespaced == "true" ) %}
|
||||||
|
{% set prefix2 %}{{prefix}}{{asset.name|swiftIdentifier:"pretty"|escapeReservedKeywords}}.{% endset %}
|
||||||
|
{% call allValuesBlock asset.items filter prefix2 %}
|
||||||
|
{% elif asset.items %}
|
||||||
|
{% call allValuesBlock asset.items filter prefix %}
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
{% endmacro %}
|
||||||
|
// swiftlint:disable identifier_name line_length nesting type_body_length type_name
|
||||||
|
{{accessModifier}} enum {{enumName}} {
|
||||||
|
{% if catalogs.count > 1 or param.forceFileNameEnum %}
|
||||||
|
{% for catalog in catalogs %}
|
||||||
|
{{accessModifier}} enum {{catalog.name|swiftIdentifier:"pretty"|escapeReservedKeywords}} {
|
||||||
|
{% filter indent:2 %}{% call enumBlock catalog.assets %}{% endfilter %}
|
||||||
|
}
|
||||||
|
{% endfor %}
|
||||||
|
{% else %}
|
||||||
|
{% call enumBlock catalogs.first.assets %}
|
||||||
|
{% endif %}
|
||||||
|
}
|
||||||
|
// swiftlint:enable identifier_name line_length nesting type_body_length type_name
|
||||||
|
|
||||||
|
// MARK: - Implementation Details
|
||||||
|
{% if resourceCount.arresourcegroup > 0 %}
|
||||||
|
|
||||||
|
{{accessModifier}} struct {{arResourceGroupType}} {
|
||||||
|
{{accessModifier}} fileprivate(set) var name: String
|
||||||
|
|
||||||
|
#if os(iOS)
|
||||||
|
@available(iOS 11.3, *)
|
||||||
|
{{accessModifier}} var referenceImages: Set<ARReferenceImage> {
|
||||||
|
return ARReferenceImage.referenceImages(in: self)
|
||||||
|
}
|
||||||
|
|
||||||
|
@available(iOS 12.0, *)
|
||||||
|
{{accessModifier}} var referenceObjects: Set<ARReferenceObject> {
|
||||||
|
return ARReferenceObject.referenceObjects(in: self)
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
#if os(iOS)
|
||||||
|
@available(iOS 11.3, *)
|
||||||
|
{{accessModifier}} extension ARReferenceImage {
|
||||||
|
static func referenceImages(in asset: {{arResourceGroupType}}) -> Set<ARReferenceImage> {
|
||||||
|
let bundle = {{param.bundle|default:"BundleToken.bundle"}}
|
||||||
|
return referenceImages(inGroupNamed: asset.name, bundle: bundle) ?? Set()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@available(iOS 12.0, *)
|
||||||
|
{{accessModifier}} extension ARReferenceObject {
|
||||||
|
static func referenceObjects(in asset: {{arResourceGroupType}}) -> Set<ARReferenceObject> {
|
||||||
|
let bundle = {{param.bundle|default:"BundleToken.bundle"}}
|
||||||
|
return referenceObjects(inGroupNamed: asset.name, bundle: bundle) ?? Set()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
{% endif %}
|
||||||
|
{% if resourceCount.color > 0 %}
|
||||||
|
|
||||||
|
{{accessModifier}} final class {{colorType}} {
|
||||||
|
{{accessModifier}} fileprivate(set) var name: String
|
||||||
|
|
||||||
|
#if os(macOS)
|
||||||
|
{{accessModifier}} typealias Color = NSColor
|
||||||
|
#elseif os(iOS) || os(tvOS) || os(watchOS)
|
||||||
|
{{accessModifier}} typealias Color = UIColor
|
||||||
|
#endif
|
||||||
|
|
||||||
|
@available(iOS 11.0, tvOS 11.0, watchOS 4.0, macOS 10.13, *)
|
||||||
|
{{accessModifier}} private(set) lazy var color: Color = Color(asset: self)
|
||||||
|
|
||||||
|
#if os(iOS) || os(tvOS)
|
||||||
|
@available(iOS 11.0, tvOS 11.0, *)
|
||||||
|
{{accessModifier}} func color(compatibleWith traitCollection: UITraitCollection) -> Color {
|
||||||
|
let bundle = {{param.bundle|default:"BundleToken.bundle"}}
|
||||||
|
guard let color = Color(named: name, in: bundle, compatibleWith: traitCollection) else {
|
||||||
|
fatalError("Unable to load color asset named \(name).")
|
||||||
|
}
|
||||||
|
return color
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
fileprivate init(name: String) {
|
||||||
|
self.name = name
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
{{accessModifier}} extension {{colorType}}.Color {
|
||||||
|
@available(iOS 11.0, tvOS 11.0, watchOS 4.0, macOS 10.13, *)
|
||||||
|
convenience init!(asset: {{colorType}}) {
|
||||||
|
let bundle = {{param.bundle|default:"BundleToken.bundle"}}
|
||||||
|
#if os(iOS) || os(tvOS)
|
||||||
|
self.init(named: asset.name, in: bundle, compatibleWith: nil)
|
||||||
|
#elseif os(macOS)
|
||||||
|
self.init(named: NSColor.Name(asset.name), bundle: bundle)
|
||||||
|
#elseif os(watchOS)
|
||||||
|
self.init(named: asset.name)
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
{% endif %}
|
||||||
|
{% if resourceCount.data > 0 %}
|
||||||
|
|
||||||
|
{{accessModifier}} struct {{dataType}} {
|
||||||
|
{{accessModifier}} fileprivate(set) var name: String
|
||||||
|
|
||||||
|
@available(iOS 9.0, tvOS 9.0, watchOS 6.0, macOS 10.11, *)
|
||||||
|
{{accessModifier}} var data: NSDataAsset {
|
||||||
|
return NSDataAsset(asset: self)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@available(iOS 9.0, tvOS 9.0, watchOS 6.0, macOS 10.11, *)
|
||||||
|
{{accessModifier}} extension NSDataAsset {
|
||||||
|
convenience init!(asset: {{dataType}}) {
|
||||||
|
let bundle = {{param.bundle|default:"BundleToken.bundle"}}
|
||||||
|
#if os(iOS) || os(tvOS) || os(watchOS)
|
||||||
|
self.init(name: asset.name, bundle: bundle)
|
||||||
|
#elseif os(macOS)
|
||||||
|
self.init(name: NSDataAsset.Name(asset.name), bundle: bundle)
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
{% endif %}
|
||||||
|
{% if resourceCount.image > 0 %}
|
||||||
|
|
||||||
|
{{accessModifier}} struct {{imageType}} {
|
||||||
|
{{accessModifier}} fileprivate(set) var name: String
|
||||||
|
|
||||||
|
#if os(macOS)
|
||||||
|
{{accessModifier}} typealias Image = NSImage
|
||||||
|
#elseif os(iOS) || os(tvOS) || os(watchOS)
|
||||||
|
{{accessModifier}} typealias Image = UIImage
|
||||||
|
#endif
|
||||||
|
|
||||||
|
@available(iOS 8.0, tvOS 9.0, watchOS 2.0, macOS 10.7, *)
|
||||||
|
{{accessModifier}} var image: Image {
|
||||||
|
let bundle = {{param.bundle|default:"BundleToken.bundle"}}
|
||||||
|
#if os(iOS) || os(tvOS)
|
||||||
|
let image = Image(named: name, in: bundle, compatibleWith: nil)
|
||||||
|
#elseif os(macOS)
|
||||||
|
let name = NSImage.Name(self.name)
|
||||||
|
let image = (bundle == .main) ? NSImage(named: name) : bundle.image(forResource: name)
|
||||||
|
#elseif os(watchOS)
|
||||||
|
let image = Image(named: name)
|
||||||
|
#endif
|
||||||
|
guard let result = image else {
|
||||||
|
fatalError("Unable to load image asset named \(name).")
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
#if os(iOS) || os(tvOS)
|
||||||
|
@available(iOS 8.0, tvOS 9.0, *)
|
||||||
|
{{accessModifier}} func image(compatibleWith traitCollection: UITraitCollection) -> Image {
|
||||||
|
let bundle = {{param.bundle|default:"BundleToken.bundle"}}
|
||||||
|
guard let result = Image(named: name, in: bundle, compatibleWith: traitCollection) else {
|
||||||
|
fatalError("Unable to load image asset named \(name).")
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
{{accessModifier}} extension {{imageType}}.Image {
|
||||||
|
@available(iOS 8.0, tvOS 9.0, watchOS 2.0, *)
|
||||||
|
@available(macOS, deprecated,
|
||||||
|
message: "This initializer is unsafe on macOS, please use the {{imageType}}.image property")
|
||||||
|
convenience init!(asset: {{imageType}}) {
|
||||||
|
#if os(iOS) || os(tvOS)
|
||||||
|
let bundle = {{param.bundle|default:"BundleToken.bundle"}}
|
||||||
|
self.init(named: asset.name, in: bundle, compatibleWith: nil)
|
||||||
|
#elseif os(macOS)
|
||||||
|
self.init(named: NSImage.Name(asset.name))
|
||||||
|
#elseif os(watchOS)
|
||||||
|
self.init(named: asset.name)
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
{% endif %}
|
||||||
|
{% if resourceCount.symbol > 0 %}
|
||||||
|
|
||||||
|
{{accessModifier}} struct {{symbolType}} {
|
||||||
|
{{accessModifier}} fileprivate(set) var name: String
|
||||||
|
|
||||||
|
#if os(iOS) || os(tvOS) || os(watchOS)
|
||||||
|
@available(iOS 13.0, tvOS 13.0, watchOS 6.0, *)
|
||||||
|
{{accessModifier}} typealias Configuration = UIImage.SymbolConfiguration
|
||||||
|
{{accessModifier}} typealias Image = UIImage
|
||||||
|
|
||||||
|
@available(iOS 12.0, tvOS 12.0, watchOS 5.0, *)
|
||||||
|
{{accessModifier}} var image: Image {
|
||||||
|
let bundle = {{param.bundle|default:"BundleToken.bundle"}}
|
||||||
|
#if os(iOS) || os(tvOS)
|
||||||
|
let image = Image(named: name, in: bundle, compatibleWith: nil)
|
||||||
|
#elseif os(watchOS)
|
||||||
|
let image = Image(named: name)
|
||||||
|
#endif
|
||||||
|
guard let result = image else {
|
||||||
|
fatalError("Unable to load symbol asset named \(name).")
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
@available(iOS 13.0, tvOS 13.0, watchOS 6.0, *)
|
||||||
|
{{accessModifier}} func image(with configuration: Configuration) -> Image {
|
||||||
|
let bundle = {{param.bundle|default:"BundleToken.bundle"}}
|
||||||
|
guard let result = Image(named: name, in: bundle, with: configuration) else {
|
||||||
|
fatalError("Unable to load symbol asset named \(name).")
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
{% endif %}
|
||||||
|
{% if not param.bundle %}
|
||||||
|
|
||||||
|
// 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 assets found
|
||||||
|
{% endif %}
|
|
@ -0,0 +1,337 @@
|
||||||
|
// swiftlint:disable all
|
||||||
|
// Generated using SwiftGen — https://github.com/SwiftGen/SwiftGen
|
||||||
|
|
||||||
|
{% if catalogs %}
|
||||||
|
{% set enumName %}{{param.enumName|default:"Asset"}}{% endset %}
|
||||||
|
{% set arResourceGroupType %}{{param.arResourceGroupTypeName|default:"ARResourceGroupAsset"}}{% endset %}
|
||||||
|
{% set colorType %}{{param.colorTypeName|default:"ColorAsset"}}{% endset %}
|
||||||
|
{% set dataType %}{{param.dataTypeName|default:"DataAsset"}}{% endset %}
|
||||||
|
{% set imageType %}{{param.imageTypeName|default:"ImageAsset"}}{% endset %}
|
||||||
|
{% set symbolType %}{{param.symbolTypeName|default:"SymbolAsset"}}{% endset %}
|
||||||
|
{% set forceNamespaces %}{{param.forceProvidesNamespaces|default:"false"}}{% endset %}
|
||||||
|
{% set accessModifier %}{% if param.publicAccess %}public{% else %}internal{% endif %}{% endset %}
|
||||||
|
#if os(macOS)
|
||||||
|
import AppKit
|
||||||
|
#elseif os(iOS)
|
||||||
|
{% if resourceCount.arresourcegroup > 0 %}
|
||||||
|
import ARKit
|
||||||
|
{% endif %}
|
||||||
|
import UIKit
|
||||||
|
#elseif os(tvOS) || os(watchOS)
|
||||||
|
import UIKit
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Deprecated typealiases
|
||||||
|
{% if resourceCount.color > 0 %}
|
||||||
|
@available(*, deprecated, renamed: "{{colorType}}.Color", message: "This typealias will be removed in SwiftGen 7.0")
|
||||||
|
{{accessModifier}} typealias {{param.colorAliasName|default:"AssetColorTypeAlias"}} = {{colorType}}.Color
|
||||||
|
{% endif %}
|
||||||
|
{% if resourceCount.image > 0 %}
|
||||||
|
@available(*, deprecated, renamed: "{{imageType}}.Image", message: "This typealias will be removed in SwiftGen 7.0")
|
||||||
|
{{accessModifier}} typealias {{param.imageAliasName|default:"AssetImageTypeAlias"}} = {{imageType}}.Image
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
// swiftlint:disable superfluous_disable_command file_length implicit_return
|
||||||
|
|
||||||
|
// MARK: - Asset Catalogs
|
||||||
|
|
||||||
|
{% macro enumBlock assets %}
|
||||||
|
{% call casesBlock assets %}
|
||||||
|
{% if param.allValues %}
|
||||||
|
|
||||||
|
// swiftlint:disable trailing_comma
|
||||||
|
{% if resourceCount.arresourcegroup > 0 %}
|
||||||
|
{{accessModifier}} static let allResourceGroups: [{{arResourceGroupType}}] = [
|
||||||
|
{% filter indent:2 %}{% call allValuesBlock assets "arresourcegroup" "" %}{% endfilter %}
|
||||||
|
]
|
||||||
|
{% endif %}
|
||||||
|
{% if resourceCount.color > 0 %}
|
||||||
|
{{accessModifier}} static let allColors: [{{colorType}}] = [
|
||||||
|
{% filter indent:2 %}{% call allValuesBlock assets "color" "" %}{% endfilter %}
|
||||||
|
]
|
||||||
|
{% endif %}
|
||||||
|
{% if resourceCount.data > 0 %}
|
||||||
|
{{accessModifier}} static let allDataAssets: [{{dataType}}] = [
|
||||||
|
{% filter indent:2 %}{% call allValuesBlock assets "data" "" %}{% endfilter %}
|
||||||
|
]
|
||||||
|
{% endif %}
|
||||||
|
{% if resourceCount.image > 0 %}
|
||||||
|
{{accessModifier}} static let allImages: [{{imageType}}] = [
|
||||||
|
{% filter indent:2 %}{% call allValuesBlock assets "image" "" %}{% endfilter %}
|
||||||
|
]
|
||||||
|
{% endif %}
|
||||||
|
{% if resourceCount.symbol > 0 %}
|
||||||
|
{{accessModifier}} static let allSymbols: [{{symbolType}}] = [
|
||||||
|
{% filter indent:2 %}{% call allValuesBlock assets "symbol" "" %}{% endfilter %}
|
||||||
|
]
|
||||||
|
{% endif %}
|
||||||
|
// swiftlint:enable trailing_comma
|
||||||
|
{% endif %}
|
||||||
|
{% endmacro %}
|
||||||
|
{% macro casesBlock assets %}
|
||||||
|
{% for asset in assets %}
|
||||||
|
{% if asset.type == "arresourcegroup" %}
|
||||||
|
{{accessModifier}} static let {{asset.name|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}} = {{arResourceGroupType}}(name: "{{asset.value}}")
|
||||||
|
{% elif asset.type == "color" %}
|
||||||
|
{{accessModifier}} static let {{asset.name|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}} = {{colorType}}(name: "{{asset.value}}")
|
||||||
|
{% elif asset.type == "data" %}
|
||||||
|
{{accessModifier}} static let {{asset.name|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}} = {{dataType}}(name: "{{asset.value}}")
|
||||||
|
{% elif asset.type == "image" %}
|
||||||
|
{{accessModifier}} static let {{asset.name|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}} = {{imageType}}(name: "{{asset.value}}")
|
||||||
|
{% elif asset.type == "symbol" %}
|
||||||
|
{{accessModifier}} static let {{asset.name|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}} = {{symbolType}}(name: "{{asset.value}}")
|
||||||
|
{% elif asset.items and ( forceNamespaces == "true" or asset.isNamespaced == "true" ) %}
|
||||||
|
{{accessModifier}} enum {{asset.name|swiftIdentifier:"pretty"|escapeReservedKeywords}} {
|
||||||
|
{% filter indent:2 %}{% call casesBlock asset.items %}{% endfilter %}
|
||||||
|
}
|
||||||
|
{% elif asset.items %}
|
||||||
|
{% call casesBlock asset.items %}
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
{% endmacro %}
|
||||||
|
{% macro allValuesBlock assets filter prefix %}
|
||||||
|
{% for asset in assets %}
|
||||||
|
{% if asset.type == filter %}
|
||||||
|
{{prefix}}{{asset.name|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}},
|
||||||
|
{% elif asset.items and ( forceNamespaces == "true" or asset.isNamespaced == "true" ) %}
|
||||||
|
{% set prefix2 %}{{prefix}}{{asset.name|swiftIdentifier:"pretty"|escapeReservedKeywords}}.{% endset %}
|
||||||
|
{% call allValuesBlock asset.items filter prefix2 %}
|
||||||
|
{% elif asset.items %}
|
||||||
|
{% call allValuesBlock asset.items filter prefix %}
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
{% endmacro %}
|
||||||
|
// swiftlint:disable identifier_name line_length nesting type_body_length type_name
|
||||||
|
{{accessModifier}} enum {{enumName}} {
|
||||||
|
{% if catalogs.count > 1 or param.forceFileNameEnum %}
|
||||||
|
{% for catalog in catalogs %}
|
||||||
|
{{accessModifier}} enum {{catalog.name|swiftIdentifier:"pretty"|escapeReservedKeywords}} {
|
||||||
|
{% filter indent:2 %}{% call enumBlock catalog.assets %}{% endfilter %}
|
||||||
|
}
|
||||||
|
{% endfor %}
|
||||||
|
{% else %}
|
||||||
|
{% call enumBlock catalogs.first.assets %}
|
||||||
|
{% endif %}
|
||||||
|
}
|
||||||
|
// swiftlint:enable identifier_name line_length nesting type_body_length type_name
|
||||||
|
|
||||||
|
// MARK: - Implementation Details
|
||||||
|
{% if resourceCount.arresourcegroup > 0 %}
|
||||||
|
|
||||||
|
{{accessModifier}} struct {{arResourceGroupType}} {
|
||||||
|
{{accessModifier}} fileprivate(set) var name: String
|
||||||
|
|
||||||
|
#if os(iOS)
|
||||||
|
@available(iOS 11.3, *)
|
||||||
|
{{accessModifier}} var referenceImages: Set<ARReferenceImage> {
|
||||||
|
return ARReferenceImage.referenceImages(in: self)
|
||||||
|
}
|
||||||
|
|
||||||
|
@available(iOS 12.0, *)
|
||||||
|
{{accessModifier}} var referenceObjects: Set<ARReferenceObject> {
|
||||||
|
return ARReferenceObject.referenceObjects(in: self)
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
#if os(iOS)
|
||||||
|
@available(iOS 11.3, *)
|
||||||
|
{{accessModifier}} extension ARReferenceImage {
|
||||||
|
static func referenceImages(in asset: {{arResourceGroupType}}) -> Set<ARReferenceImage> {
|
||||||
|
let bundle = {{param.bundle|default:"BundleToken.bundle"}}
|
||||||
|
return referenceImages(inGroupNamed: asset.name, bundle: bundle) ?? Set()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@available(iOS 12.0, *)
|
||||||
|
{{accessModifier}} extension ARReferenceObject {
|
||||||
|
static func referenceObjects(in asset: {{arResourceGroupType}}) -> Set<ARReferenceObject> {
|
||||||
|
let bundle = {{param.bundle|default:"BundleToken.bundle"}}
|
||||||
|
return referenceObjects(inGroupNamed: asset.name, bundle: bundle) ?? Set()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
{% endif %}
|
||||||
|
{% if resourceCount.color > 0 %}
|
||||||
|
|
||||||
|
{{accessModifier}} final class {{colorType}} {
|
||||||
|
{{accessModifier}} fileprivate(set) var name: String
|
||||||
|
|
||||||
|
#if os(macOS)
|
||||||
|
{{accessModifier}} typealias Color = NSColor
|
||||||
|
#elseif os(iOS) || os(tvOS) || os(watchOS)
|
||||||
|
{{accessModifier}} typealias Color = UIColor
|
||||||
|
#endif
|
||||||
|
|
||||||
|
@available(iOS 11.0, tvOS 11.0, watchOS 4.0, macOS 10.13, *)
|
||||||
|
{{accessModifier}} private(set) lazy var color: Color = {
|
||||||
|
guard let color = Color(asset: self) else {
|
||||||
|
fatalError("Unable to load color asset named \(name).")
|
||||||
|
}
|
||||||
|
return color
|
||||||
|
}()
|
||||||
|
|
||||||
|
#if os(iOS) || os(tvOS)
|
||||||
|
@available(iOS 11.0, tvOS 11.0, *)
|
||||||
|
{{accessModifier}} func color(compatibleWith traitCollection: UITraitCollection) -> Color {
|
||||||
|
let bundle = {{param.bundle|default:"BundleToken.bundle"}}
|
||||||
|
guard let color = Color(named: name, in: bundle, compatibleWith: traitCollection) else {
|
||||||
|
fatalError("Unable to load color asset named \(name).")
|
||||||
|
}
|
||||||
|
return color
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
fileprivate init(name: String) {
|
||||||
|
self.name = name
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
{{accessModifier}} extension {{colorType}}.Color {
|
||||||
|
@available(iOS 11.0, tvOS 11.0, watchOS 4.0, macOS 10.13, *)
|
||||||
|
convenience init?(asset: {{colorType}}) {
|
||||||
|
let bundle = {{param.bundle|default:"BundleToken.bundle"}}
|
||||||
|
#if os(iOS) || os(tvOS)
|
||||||
|
self.init(named: asset.name, in: bundle, compatibleWith: nil)
|
||||||
|
#elseif os(macOS)
|
||||||
|
self.init(named: NSColor.Name(asset.name), bundle: bundle)
|
||||||
|
#elseif os(watchOS)
|
||||||
|
self.init(named: asset.name)
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
{% endif %}
|
||||||
|
{% if resourceCount.data > 0 %}
|
||||||
|
|
||||||
|
{{accessModifier}} struct {{dataType}} {
|
||||||
|
{{accessModifier}} fileprivate(set) var name: String
|
||||||
|
|
||||||
|
@available(iOS 9.0, tvOS 9.0, watchOS 6.0, macOS 10.11, *)
|
||||||
|
{{accessModifier}} var data: NSDataAsset {
|
||||||
|
guard let data = NSDataAsset(asset: self) else {
|
||||||
|
fatalError("Unable to load data asset named \(name).")
|
||||||
|
}
|
||||||
|
return data
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@available(iOS 9.0, tvOS 9.0, watchOS 6.0, macOS 10.11, *)
|
||||||
|
{{accessModifier}} extension NSDataAsset {
|
||||||
|
convenience init?(asset: {{dataType}}) {
|
||||||
|
let bundle = {{param.bundle|default:"BundleToken.bundle"}}
|
||||||
|
#if os(iOS) || os(tvOS) || os(watchOS)
|
||||||
|
self.init(name: asset.name, bundle: bundle)
|
||||||
|
#elseif os(macOS)
|
||||||
|
self.init(name: NSDataAsset.Name(asset.name), bundle: bundle)
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
{% endif %}
|
||||||
|
{% if resourceCount.image > 0 %}
|
||||||
|
|
||||||
|
{{accessModifier}} struct {{imageType}} {
|
||||||
|
{{accessModifier}} fileprivate(set) var name: String
|
||||||
|
|
||||||
|
#if os(macOS)
|
||||||
|
{{accessModifier}} typealias Image = NSImage
|
||||||
|
#elseif os(iOS) || os(tvOS) || os(watchOS)
|
||||||
|
{{accessModifier}} typealias Image = UIImage
|
||||||
|
#endif
|
||||||
|
|
||||||
|
@available(iOS 8.0, tvOS 9.0, watchOS 2.0, macOS 10.7, *)
|
||||||
|
{{accessModifier}} var image: Image {
|
||||||
|
let bundle = {{param.bundle|default:"BundleToken.bundle"}}
|
||||||
|
#if os(iOS) || os(tvOS)
|
||||||
|
let image = Image(named: name, in: bundle, compatibleWith: nil)
|
||||||
|
#elseif os(macOS)
|
||||||
|
let name = NSImage.Name(self.name)
|
||||||
|
let image = (bundle == .main) ? NSImage(named: name) : bundle.image(forResource: name)
|
||||||
|
#elseif os(watchOS)
|
||||||
|
let image = Image(named: name)
|
||||||
|
#endif
|
||||||
|
guard let result = image else {
|
||||||
|
fatalError("Unable to load image asset named \(name).")
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
#if os(iOS) || os(tvOS)
|
||||||
|
@available(iOS 8.0, tvOS 9.0, *)
|
||||||
|
{{accessModifier}} func image(compatibleWith traitCollection: UITraitCollection) -> Image {
|
||||||
|
let bundle = {{param.bundle|default:"BundleToken.bundle"}}
|
||||||
|
guard let result = Image(named: name, in: bundle, compatibleWith: traitCollection) else {
|
||||||
|
fatalError("Unable to load image asset named \(name).")
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
{{accessModifier}} extension {{imageType}}.Image {
|
||||||
|
@available(iOS 8.0, tvOS 9.0, watchOS 2.0, *)
|
||||||
|
@available(macOS, deprecated,
|
||||||
|
message: "This initializer is unsafe on macOS, please use the {{imageType}}.image property")
|
||||||
|
convenience init?(asset: {{imageType}}) {
|
||||||
|
#if os(iOS) || os(tvOS)
|
||||||
|
let bundle = {{param.bundle|default:"BundleToken.bundle"}}
|
||||||
|
self.init(named: asset.name, in: bundle, compatibleWith: nil)
|
||||||
|
#elseif os(macOS)
|
||||||
|
self.init(named: NSImage.Name(asset.name))
|
||||||
|
#elseif os(watchOS)
|
||||||
|
self.init(named: asset.name)
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
{% endif %}
|
||||||
|
{% if resourceCount.symbol > 0 %}
|
||||||
|
|
||||||
|
{{accessModifier}} struct {{symbolType}} {
|
||||||
|
{{accessModifier}} fileprivate(set) var name: String
|
||||||
|
|
||||||
|
#if os(iOS) || os(tvOS) || os(watchOS)
|
||||||
|
@available(iOS 13.0, tvOS 13.0, watchOS 6.0, *)
|
||||||
|
{{accessModifier}} typealias Configuration = UIImage.SymbolConfiguration
|
||||||
|
{{accessModifier}} typealias Image = UIImage
|
||||||
|
|
||||||
|
@available(iOS 12.0, tvOS 12.0, watchOS 5.0, *)
|
||||||
|
{{accessModifier}} var image: Image {
|
||||||
|
let bundle = {{param.bundle|default:"BundleToken.bundle"}}
|
||||||
|
#if os(iOS) || os(tvOS)
|
||||||
|
let image = Image(named: name, in: bundle, compatibleWith: nil)
|
||||||
|
#elseif os(watchOS)
|
||||||
|
let image = Image(named: name)
|
||||||
|
#endif
|
||||||
|
guard let result = image else {
|
||||||
|
fatalError("Unable to load symbol asset named \(name).")
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
@available(iOS 13.0, tvOS 13.0, watchOS 6.0, *)
|
||||||
|
{{accessModifier}} func image(with configuration: Configuration) -> Image {
|
||||||
|
let bundle = {{param.bundle|default:"BundleToken.bundle"}}
|
||||||
|
guard let result = Image(named: name, in: bundle, with: configuration) else {
|
||||||
|
fatalError("Unable to load symbol asset named \(name).")
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
{% endif %}
|
||||||
|
{% if not param.bundle %}
|
||||||
|
|
||||||
|
// 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 assets found
|
||||||
|
{% endif %}
|
|
@ -0,0 +1,92 @@
|
||||||
|
// swiftlint:disable all
|
||||||
|
// Generated using SwiftGen — https://github.com/SwiftGen/SwiftGen
|
||||||
|
|
||||||
|
{% if files %}
|
||||||
|
{% set accessModifier %}{% if param.publicAccess %}public{% else %}internal{% endif %}{% endset %}
|
||||||
|
{% set documentPrefix %}{{param.documentName|default:"Document"}}{% endset %}
|
||||||
|
import Foundation
|
||||||
|
|
||||||
|
// swiftlint:disable superfluous_disable_command
|
||||||
|
// swiftlint:disable file_length
|
||||||
|
|
||||||
|
// MARK: - YAML Files
|
||||||
|
{% macro fileBlock file %}
|
||||||
|
{% if file.documents.count > 1 %}
|
||||||
|
{% for document in file.documents %}
|
||||||
|
{% set documentName %}{{documentPrefix}}{{forloop.counter}}{% endset %}
|
||||||
|
{{accessModifier}} enum {{documentName|swiftIdentifier:"pretty"|escapeReservedKeywords}} {
|
||||||
|
{% filter indent:2 %}{% call documentBlock file document %}{% endfilter %}
|
||||||
|
}
|
||||||
|
{% endfor %}
|
||||||
|
{% else %}
|
||||||
|
{% call documentBlock file file.documents.first %}
|
||||||
|
{% endif %}
|
||||||
|
{% endmacro %}
|
||||||
|
{% macro documentBlock file document %}
|
||||||
|
{% set rootType %}{% call typeBlock document.metadata %}{% endset %}
|
||||||
|
{% if document.metadata.type == "Array" %}
|
||||||
|
{{accessModifier}} static let items: {{rootType}} = {% call valueBlock document.data document.metadata %}
|
||||||
|
{% elif document.metadata.type == "Dictionary" %}
|
||||||
|
{% for key,value in document.metadata.properties %}
|
||||||
|
{{accessModifier}} {% call propertyBlock key value document.data %}
|
||||||
|
{% endfor %}
|
||||||
|
{% else %}
|
||||||
|
{{accessModifier}} static let value: {{rootType}} = {% call valueBlock document.data document.metadata %}
|
||||||
|
{% endif %}
|
||||||
|
{% endmacro %}
|
||||||
|
{% macro typeBlock metadata %}{% filter removeNewlines:"leading" %}
|
||||||
|
{% if metadata.type == "Array" %}
|
||||||
|
[{% call typeBlock metadata.element %}]
|
||||||
|
{% elif metadata.type == "Dictionary" %}
|
||||||
|
[String: Any]
|
||||||
|
{% elif metadata.type == "Optional" %}
|
||||||
|
Any?
|
||||||
|
{% else %}
|
||||||
|
{{metadata.type}}
|
||||||
|
{% endif %}
|
||||||
|
{% endfilter %}{% endmacro %}
|
||||||
|
{% macro propertyBlock key metadata data %}{% filter removeNewlines:"leading" %}
|
||||||
|
{% set propertyName %}{{key|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}}{% endset %}
|
||||||
|
{% set propertyType %}{% call typeBlock metadata %}{% endset %}
|
||||||
|
static let {{propertyName}}: {{propertyType}} = {% call valueBlock data[key] metadata %}
|
||||||
|
{% endfilter %}{% endmacro %}
|
||||||
|
{% macro valueBlock value metadata %}{% filter removeNewlines:"leading" %}
|
||||||
|
{% if metadata.type == "String" %}
|
||||||
|
"{{ value }}"
|
||||||
|
{% elif metadata.type == "Optional" %}
|
||||||
|
nil
|
||||||
|
{% elif metadata.type == "Array" and value %}
|
||||||
|
[{% for value in value %}
|
||||||
|
{% call valueBlock value metadata.element.items[forloop.counter0]|default:metadata.element %}
|
||||||
|
{{ ", " if not forloop.last }}
|
||||||
|
{% endfor %}]
|
||||||
|
{% elif metadata.type == "Dictionary" %}
|
||||||
|
[{% for key,value in value %}
|
||||||
|
"{{key}}": {% call valueBlock value metadata.properties[key] %}
|
||||||
|
{{ ", " if not forloop.last }}
|
||||||
|
{% empty %}
|
||||||
|
:
|
||||||
|
{% endfor %}]
|
||||||
|
{% elif metadata.type == "Bool" %}
|
||||||
|
{% if value %}true{% else %}false{% endif %}
|
||||||
|
{% else %}
|
||||||
|
{{ value }}
|
||||||
|
{% endif %}
|
||||||
|
{% endfilter %}{% endmacro %}
|
||||||
|
|
||||||
|
// swiftlint:disable identifier_name line_length number_separator type_body_length
|
||||||
|
{{accessModifier}} enum {{param.enumName|default:"YAMLFiles"}} {
|
||||||
|
{% if files.count > 1 or param.forceFileNameEnum %}
|
||||||
|
{% for file in files %}
|
||||||
|
{{accessModifier}} enum {{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 number_separator type_body_length
|
||||||
|
{% else %}
|
||||||
|
// No files found
|
||||||
|
{% endif %}
|
|
@ -0,0 +1,92 @@
|
||||||
|
// swiftlint:disable all
|
||||||
|
// Generated using SwiftGen — https://github.com/SwiftGen/SwiftGen
|
||||||
|
|
||||||
|
{% if files %}
|
||||||
|
{% set accessModifier %}{% if param.publicAccess %}public{% else %}internal{% endif %}{% endset %}
|
||||||
|
{% set documentPrefix %}{{param.documentName|default:"Document"}}{% endset %}
|
||||||
|
import Foundation
|
||||||
|
|
||||||
|
// swiftlint:disable superfluous_disable_command
|
||||||
|
// swiftlint:disable file_length
|
||||||
|
|
||||||
|
// MARK: - YAML Files
|
||||||
|
{% macro fileBlock file %}
|
||||||
|
{% if file.documents.count > 1 %}
|
||||||
|
{% for document in file.documents %}
|
||||||
|
{% set documentName %}{{documentPrefix}}{{forloop.counter}}{% endset %}
|
||||||
|
{{accessModifier}} enum {{documentName|swiftIdentifier:"pretty"|escapeReservedKeywords}} {
|
||||||
|
{% filter indent:2 %}{% call documentBlock file document %}{% endfilter %}
|
||||||
|
}
|
||||||
|
{% endfor %}
|
||||||
|
{% else %}
|
||||||
|
{% call documentBlock file file.documents.first %}
|
||||||
|
{% endif %}
|
||||||
|
{% endmacro %}
|
||||||
|
{% macro documentBlock file document %}
|
||||||
|
{% set rootType %}{% call typeBlock document.metadata %}{% endset %}
|
||||||
|
{% if document.metadata.type == "Array" %}
|
||||||
|
{{accessModifier}} static let items: {{rootType}} = {% call valueBlock document.data document.metadata %}
|
||||||
|
{% elif document.metadata.type == "Dictionary" %}
|
||||||
|
{% for key,value in document.metadata.properties %}
|
||||||
|
{{accessModifier}} {% call propertyBlock key value document.data %}
|
||||||
|
{% endfor %}
|
||||||
|
{% else %}
|
||||||
|
{{accessModifier}} static let value: {{rootType}} = {% call valueBlock document.data document.metadata %}
|
||||||
|
{% endif %}
|
||||||
|
{% endmacro %}
|
||||||
|
{% macro typeBlock metadata %}{% filter removeNewlines:"leading" %}
|
||||||
|
{% if metadata.type == "Array" %}
|
||||||
|
[{% call typeBlock metadata.element %}]
|
||||||
|
{% elif metadata.type == "Dictionary" %}
|
||||||
|
[String: Any]
|
||||||
|
{% elif metadata.type == "Optional" %}
|
||||||
|
Any?
|
||||||
|
{% else %}
|
||||||
|
{{metadata.type}}
|
||||||
|
{% endif %}
|
||||||
|
{% endfilter %}{% endmacro %}
|
||||||
|
{% macro propertyBlock key metadata data %}{% filter removeNewlines:"leading" %}
|
||||||
|
{% set propertyName %}{{key|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}}{% endset %}
|
||||||
|
{% set propertyType %}{% call typeBlock metadata %}{% endset %}
|
||||||
|
static let {{propertyName}}: {{propertyType}} = {% call valueBlock data[key] metadata %}
|
||||||
|
{% endfilter %}{% endmacro %}
|
||||||
|
{% macro valueBlock value metadata %}{% filter removeNewlines:"leading" %}
|
||||||
|
{% if metadata.type == "String" %}
|
||||||
|
"{{ value }}"
|
||||||
|
{% elif metadata.type == "Optional" %}
|
||||||
|
nil
|
||||||
|
{% elif metadata.type == "Array" and value %}
|
||||||
|
[{% for value in value %}
|
||||||
|
{% call valueBlock value metadata.element.items[forloop.counter0]|default:metadata.element %}
|
||||||
|
{{ ", " if not forloop.last }}
|
||||||
|
{% endfor %}]
|
||||||
|
{% elif metadata.type == "Dictionary" %}
|
||||||
|
[{% for key,value in value %}
|
||||||
|
"{{key}}": {% call valueBlock value metadata.properties[key] %}
|
||||||
|
{{ ", " if not forloop.last }}
|
||||||
|
{% empty %}
|
||||||
|
:
|
||||||
|
{% endfor %}]
|
||||||
|
{% elif metadata.type == "Bool" %}
|
||||||
|
{% if value %}true{% else %}false{% endif %}
|
||||||
|
{% else %}
|
||||||
|
{{ value }}
|
||||||
|
{% endif %}
|
||||||
|
{% endfilter %}{% endmacro %}
|
||||||
|
|
||||||
|
// swiftlint:disable identifier_name line_length number_separator type_body_length
|
||||||
|
{{accessModifier}} enum {{param.enumName|default:"YAMLFiles"}} {
|
||||||
|
{% if files.count > 1 or param.forceFileNameEnum %}
|
||||||
|
{% for file in files %}
|
||||||
|
{{accessModifier}} enum {{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 number_separator type_body_length
|
||||||
|
{% else %}
|
||||||
|
// No files found
|
||||||
|
{% endif %}
|
BIN
Monal/.swiftgen/bin/swiftgen
Executable file
BIN
Monal/.swiftgen/bin/swiftgen
Executable file
Binary file not shown.
29
Monal/.swiftgen/templates/fonts.stencil
Normal file
29
Monal/.swiftgen/templates/fonts.stencil
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
// swiftlint:disable all
|
||||||
|
// Generated using SwiftGen — https://github.com/SwiftGen/SwiftGen
|
||||||
|
|
||||||
|
{% if families %}
|
||||||
|
import SwiftUI
|
||||||
|
{% for family in families %}
|
||||||
|
{% set identifierName %}{{family.name|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}}{% endset %}
|
||||||
|
{% set styleTypeName %}{{family.name|swiftIdentifier:"pretty"|escapeReservedKeywords}}Style{% endset %}
|
||||||
|
|
||||||
|
extension Font {
|
||||||
|
public static func {{identifierName}}(_ style: {{styleTypeName}}, fixedSize: CGFloat) -> Font {
|
||||||
|
return Font.custom(style.rawValue, fixedSize: fixedSize)
|
||||||
|
}
|
||||||
|
|
||||||
|
public static func {{identifierName}}(_ style: {{styleTypeName}}, size: CGFloat, relativeTo textStyle: TextStyle = .body) -> Font {
|
||||||
|
return Font.custom(style.rawValue, size: size, relativeTo: textStyle)
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum {{styleTypeName}}: String {
|
||||||
|
{% for font in family.fonts %}
|
||||||
|
case {{font.style|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}} = "{{font.name}}"
|
||||||
|
{% endfor %}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
{% endfor %}
|
||||||
|
{% else %}
|
||||||
|
// No fonts found
|
||||||
|
{% endif %}
|
||||||
|
// swiftlint:enable all
|
85
Monal/.swiftgen/templates/strings.stencil
Normal file
85
Monal/.swiftgen/templates/strings.stencil
Normal file
|
@ -0,0 +1,85 @@
|
||||||
|
// swiftlint:disable all
|
||||||
|
// Generated using SwiftGen — https://github.com/SwiftGen/SwiftGen
|
||||||
|
|
||||||
|
{% if tables.count > 0 %}
|
||||||
|
{% set accessModifier %}{% if param.publicAccess %}public{% else %}internal{% endif %}{% endset %}
|
||||||
|
import Foundation
|
||||||
|
|
||||||
|
// swiftlint:disable superfluous_disable_command file_length implicit_return
|
||||||
|
|
||||||
|
// MARK: - Strings
|
||||||
|
|
||||||
|
{% macro parametersBlock types %}{% filter removeNewlines:"leading" %}
|
||||||
|
{% for type in types %}
|
||||||
|
{% if type == "String" %}
|
||||||
|
_ p{{forloop.counter}}: Any
|
||||||
|
{% else %}
|
||||||
|
_ p{{forloop.counter}}: {{type}}
|
||||||
|
{% endif %}
|
||||||
|
{{ ", " if not forloop.last }}
|
||||||
|
{% endfor %}
|
||||||
|
{% endfilter %}{% endmacro %}
|
||||||
|
{% macro argumentsBlock types %}{% filter removeNewlines:"leading" %}
|
||||||
|
{% for type in types %}
|
||||||
|
{% if type == "String" %}
|
||||||
|
String(describing: p{{forloop.counter}})
|
||||||
|
{% elif type == "UnsafeRawPointer" %}
|
||||||
|
Int(bitPattern: p{{forloop.counter}})
|
||||||
|
{% else %}
|
||||||
|
p{{forloop.counter}}
|
||||||
|
{% endif %}
|
||||||
|
{{ ", " if not forloop.last }}
|
||||||
|
{% endfor %}
|
||||||
|
{% endfilter %}{% endmacro %}
|
||||||
|
{% macro recursiveBlock table item %}
|
||||||
|
{% for string in item.strings %}
|
||||||
|
{% if not param.noComments %}
|
||||||
|
{% for line in string.translation|split:"\n" %}
|
||||||
|
/// {{line}}
|
||||||
|
{% endfor %}
|
||||||
|
{% endif %}
|
||||||
|
{% if string.types %}
|
||||||
|
{{accessModifier}} static func {{string.name|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}}({% call parametersBlock string.types %}) -> String {
|
||||||
|
{{enumName}}.tr("{{table}}", "{{string.key}}", {% call argumentsBlock string.types %})
|
||||||
|
}
|
||||||
|
{% else %}
|
||||||
|
{{accessModifier}} static var {{string.name|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}}: String { {{enumName}}.tr("{{table}}", "{{string.key}}") }
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
{% for child in item.children %}
|
||||||
|
|
||||||
|
{{accessModifier}} enum {{child.name|swiftIdentifier:"pretty"|escapeReservedKeywords}} {
|
||||||
|
{% filter indent:2 %}{% call recursiveBlock table child %}{% endfilter %}
|
||||||
|
}
|
||||||
|
{% endfor %}
|
||||||
|
{% endmacro %}
|
||||||
|
// swiftlint:disable explicit_type_interface function_parameter_count identifier_name line_length
|
||||||
|
// swiftlint:disable nesting type_body_length type_name vertical_whitespace_opening_braces
|
||||||
|
{% set enumName %}{{param.enumName|default:"L10n"}}{% endset %}
|
||||||
|
{{accessModifier}} enum {{enumName}} {
|
||||||
|
{% if tables.count > 1 or param.forceFileNameEnum %}
|
||||||
|
{% for table in tables %}
|
||||||
|
{{accessModifier}} enum {{table.name|swiftIdentifier:"pretty"|escapeReservedKeywords}} {
|
||||||
|
{% filter indent:2 %}{% call recursiveBlock table.name table.levels %}{% endfilter %}
|
||||||
|
}
|
||||||
|
{% endfor %}
|
||||||
|
{% else %}
|
||||||
|
{% call recursiveBlock tables.first.name tables.first.levels %}
|
||||||
|
{% endif %}
|
||||||
|
}
|
||||||
|
// swiftlint:enable explicit_type_interface function_parameter_count identifier_name line_length
|
||||||
|
// swiftlint:enable nesting type_body_length type_name vertical_whitespace_opening_braces
|
||||||
|
|
||||||
|
// MARK: - Implementation Details
|
||||||
|
import Localize_Swift
|
||||||
|
extension {{enumName}} {
|
||||||
|
static func tr(_ table: String, _ key: String, _ args: CVarArg...) -> String {
|
||||||
|
let selectedLanguage = Localize.currentLanguage()
|
||||||
|
guard let path = Bundle.main.path(forResource: selectedLanguage, ofType: "lproj"),
|
||||||
|
let bundle = Bundle(path: path) else { return "Setup language error" }
|
||||||
|
return NSLocalizedString(key, tableName: table, bundle: bundle, comment: "")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
{% endif %}
|
||||||
|
// swiftlint: enable all
|
48
Monal/.swiftgen/templates/xcassets.stencil
Normal file
48
Monal/.swiftgen/templates/xcassets.stencil
Normal file
|
@ -0,0 +1,48 @@
|
||||||
|
// swiftlint:disable all
|
||||||
|
// Generated using SwiftGen — https://github.com/SwiftGen/SwiftGen
|
||||||
|
|
||||||
|
{% if catalogs %}
|
||||||
|
import SwiftUI
|
||||||
|
{% macro casesBlock assets %}
|
||||||
|
{% for asset in assets %}
|
||||||
|
{% if asset.items and asset.isNamespaced == "true" %}
|
||||||
|
public enum {{asset.name|swiftIdentifier:"pretty"|escapeReservedKeywords}} {
|
||||||
|
{% filter indent:2 %}{% call casesBlock asset.items %}{% endfilter %}
|
||||||
|
}
|
||||||
|
{% elif asset.items %}
|
||||||
|
{% call casesBlock asset.items %}
|
||||||
|
{% elif asset.type == "color" %}
|
||||||
|
public static let {{asset.name|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}} = Color("{{asset.value}}")
|
||||||
|
{% elif asset.type == "image" %}
|
||||||
|
public static let {{asset.name|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}} = Image("{{asset.value}}")
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
{% endmacro %}
|
||||||
|
{% for catalog in catalogs %}
|
||||||
|
{% if catalog.name == "Colors" %}
|
||||||
|
|
||||||
|
extension Color {
|
||||||
|
{% for catalog in catalogs %}
|
||||||
|
{% if catalog.name == "Colors" %}
|
||||||
|
{% call casesBlock catalog.assets %}
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
}
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
{% for catalog in catalogs %}
|
||||||
|
{% if catalog.name == "Images" %}
|
||||||
|
|
||||||
|
extension Image {
|
||||||
|
{% for catalog in catalogs %}
|
||||||
|
{% if catalog.name == "Images" %}
|
||||||
|
{% call casesBlock catalog.assets %}
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
}
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
{% else %}
|
||||||
|
// No assets found
|
||||||
|
{% endif %}
|
||||||
|
// swiftlint: enable all
|
36
Monal/.swiftgen/templates/xcassets_strings.stencil
Normal file
36
Monal/.swiftgen/templates/xcassets_strings.stencil
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
// swiftlint:disable all
|
||||||
|
// Generated using SwiftGen — https://github.com/SwiftGen/SwiftGen
|
||||||
|
|
||||||
|
{% if catalogs %}
|
||||||
|
import Foundation
|
||||||
|
|
||||||
|
typealias AssetStrings = String
|
||||||
|
{% macro casesBlock assets %}
|
||||||
|
{% for asset in assets %}
|
||||||
|
{% if asset.items and asset.isNamespaced == "true" %}
|
||||||
|
public enum {{asset.name|swiftIdentifier:"pretty"|escapeReservedKeywords}} {
|
||||||
|
{% filter indent:2 %}{% call casesBlock asset.items %}{% endfilter %}
|
||||||
|
}
|
||||||
|
{% elif asset.items %}
|
||||||
|
{% call casesBlock asset.items %}
|
||||||
|
{% elif asset.type == "image" %}
|
||||||
|
public static let {{asset.name|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}} = String("{{asset.value}}")
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
{% endmacro %}
|
||||||
|
{% for catalog in catalogs %}
|
||||||
|
{% if catalog.name == "Images" %}
|
||||||
|
|
||||||
|
extension String {
|
||||||
|
{% for catalog in catalogs %}
|
||||||
|
{% if catalog.name == "Images" %}
|
||||||
|
{% call casesBlock catalog.assets %}
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
}
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
{% else %}
|
||||||
|
// No assets found
|
||||||
|
{% endif %}
|
||||||
|
// swiftlint: enable all
|
|
@ -1414,6 +1414,7 @@
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
7E995F202CEAC5D2005B30EE /* AnotherIMApp.swift */,
|
7E995F202CEAC5D2005B30EE /* AnotherIMApp.swift */,
|
||||||
|
EA534340732BF66B533E4C0B /* Generated */,
|
||||||
7ED6F01A2CECC43D0035B3B7 /* Resources */,
|
7ED6F01A2CECC43D0035B3B7 /* Resources */,
|
||||||
7E8D7AE42CECD037009AD3DF /* Views */,
|
7E8D7AE42CECD037009AD3DF /* Views */,
|
||||||
7E8D7AE52CECD05C009AD3DF /* XMPP */,
|
7E8D7AE52CECD05C009AD3DF /* XMPP */,
|
||||||
|
@ -1605,6 +1606,13 @@
|
||||||
name = Frameworks;
|
name = Frameworks;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
|
EA534340732BF66B533E4C0B /* Generated */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
);
|
||||||
|
path = Generated;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
/* End PBXGroup section */
|
/* End PBXGroup section */
|
||||||
|
|
||||||
/* Begin PBXHeadersBuildPhase section */
|
/* Begin PBXHeadersBuildPhase section */
|
||||||
|
@ -1746,6 +1754,7 @@
|
||||||
isa = PBXNativeTarget;
|
isa = PBXNativeTarget;
|
||||||
buildConfigurationList = 7E995F172CEAC4BA005B30EE /* Build configuration list for PBXNativeTarget "another.im" */;
|
buildConfigurationList = 7E995F172CEAC4BA005B30EE /* Build configuration list for PBXNativeTarget "another.im" */;
|
||||||
buildPhases = (
|
buildPhases = (
|
||||||
|
7E8D7AE72CECD2CC009AD3DF /* swiftgen */,
|
||||||
7E8D7AE62CECD182009AD3DF /* swiftlint */,
|
7E8D7AE62CECD182009AD3DF /* swiftlint */,
|
||||||
A9E041FD8051B08903221D89 /* [CP] Check Pods Manifest.lock */,
|
A9E041FD8051B08903221D89 /* [CP] Check Pods Manifest.lock */,
|
||||||
7E995F022CEAC4B8005B30EE /* Sources */,
|
7E995F022CEAC4B8005B30EE /* Sources */,
|
||||||
|
@ -2055,6 +2064,24 @@
|
||||||
shellPath = /bin/sh;
|
shellPath = /bin/sh;
|
||||||
shellScript = "# Type a script or drag a script file from your workspace to insert its path.\nswiftlint\n";
|
shellScript = "# Type a script or drag a script file from your workspace to insert its path.\nswiftlint\n";
|
||||||
};
|
};
|
||||||
|
7E8D7AE72CECD2CC009AD3DF /* swiftgen */ = {
|
||||||
|
isa = PBXShellScriptBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
inputFileListPaths = (
|
||||||
|
);
|
||||||
|
inputPaths = (
|
||||||
|
);
|
||||||
|
name = swiftgen;
|
||||||
|
outputFileListPaths = (
|
||||||
|
);
|
||||||
|
outputPaths = (
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
shellPath = /bin/sh;
|
||||||
|
shellScript = "# Type a script or drag a script file from your workspace to insert its path.\n./.swiftgen/bin/swiftgen\n";
|
||||||
|
};
|
||||||
8FC0217E357D67979CAFB523 /* [CP] Embed Pods Frameworks */ = {
|
8FC0217E357D67979CAFB523 /* [CP] Embed Pods Frameworks */ = {
|
||||||
isa = PBXShellScriptBuildPhase;
|
isa = PBXShellScriptBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
|
|
2
Monal/another.im/Generated/.gitignore
vendored
Normal file
2
Monal/another.im/Generated/.gitignore
vendored
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
*
|
||||||
|
!.gitignore
|
27
Monal/swiftgen.yml
Normal file
27
Monal/swiftgen.yml
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
---
|
||||||
|
output_dir: another.im/Generated
|
||||||
|
input_dir: another.im/Resources
|
||||||
|
|
||||||
|
xcassets:
|
||||||
|
- inputs: Assets/Images.xcassets
|
||||||
|
outputs:
|
||||||
|
- templatePath: .swiftgen/templates/xcassets.stencil
|
||||||
|
params:
|
||||||
|
forceProvidesNamespaces: true
|
||||||
|
enumName: Image
|
||||||
|
output: Images+Generated.swift
|
||||||
|
- inputs: Assets/Colors.xcassets
|
||||||
|
outputs:
|
||||||
|
- templatePath: .swiftgen/templates/xcassets.stencil
|
||||||
|
params:
|
||||||
|
forceProvidesNamespaces: true
|
||||||
|
enumName: Color
|
||||||
|
output: Colors+Generated.swift
|
||||||
|
|
||||||
|
strings:
|
||||||
|
inputs: Strings/Localizable.strings
|
||||||
|
outputs:
|
||||||
|
# - templatePath: .templates/strings.stencil
|
||||||
|
- templateName: structured-swift5
|
||||||
|
|
||||||
|
output: Strings+Generated.swift
|
Loading…
Reference in a new issue