Files
swiftpm-mustache/Sources/HummingbirdMustache/Method.swift
2021-03-15 11:07:08 +00:00

111 lines
2.8 KiB
Swift

protocol HBMustacheMethods {
func runMethod(_ name: String) -> Any?
}
extension StringProtocol {
func runMethod(_ name: String) -> Any? {
switch name {
case "capitalized":
return self.capitalized
case "lowercased":
return self.lowercased()
case "uppercased":
return self.uppercased()
case "reversed":
return self.reversed()
default:
return nil
}
}
}
extension String: HBMustacheMethods {}
extension Substring: HBMustacheMethods {}
protocol HBComparableSequence {
func runComparableMethod(_ name: String) -> Any?
}
extension Array: HBMustacheMethods {
func runMethod(_ name: String) -> Any? {
switch name {
case "first":
return self.first
case "last":
return self.last
case "reversed":
return self.reversed()
case "count":
return self.count
default:
if let comparableSeq = self as? HBComparableSequence {
return comparableSeq.runComparableMethod(name)
}
return nil
}
}
}
extension Array: HBComparableSequence where Element: Comparable {
func runComparableMethod(_ name: String) -> Any? {
switch name {
case "sorted":
return self.sorted()
default:
return nil
}
}
}
extension Dictionary: HBMustacheMethods {
func runMethod(_ name: String) -> Any? {
switch name {
case "count":
return self.count
case "enumerated":
return self.map { (key: $0.key, value: $0.value) }
default:
if let comparableSeq = self as? HBComparableSequence {
return comparableSeq.runComparableMethod(name)
}
return nil
}
}
}
extension Dictionary: HBComparableSequence where Key: Comparable {
func runComparableMethod(_ name: String) -> Any? {
switch name {
case "sorted":
return self.map { (key: $0.key, value: $0.value) }.sorted { $0.key < $1.key }
default:
return nil
}
}
}
extension FixedWidthInteger {
func runMethod(_ name: String) -> Any? {
switch name {
case "plusone":
return self + 1
case "minusone":
return self - 1
default:
return nil
}
}
}
extension Int: HBMustacheMethods {}
extension Int8: HBMustacheMethods {}
extension Int16: HBMustacheMethods {}
extension Int32: HBMustacheMethods {}
extension Int64: HBMustacheMethods {}
extension UInt: HBMustacheMethods {}
extension UInt8: HBMustacheMethods {}
extension UInt16: HBMustacheMethods {}
extension UInt32: HBMustacheMethods {}
extension UInt64: HBMustacheMethods {}