AutoCat/AutoCatCore/Models/PlateNumber.swift

75 lines
1.8 KiB
Swift

import Foundation
public struct PlateNumber {
private var number: String = ""
private var numberEnglish: String = ""
private let maxLength = 9
private let mainPartLength = 6
private let isDigitMask = [false, true, true, true, false, false, true, true, true]
public init(_ string: String) {
setNumber(string)
}
public func asString() -> String {
return self.number.filter { !$0.isWhitespace }.uppercased()
}
public func mainPart() -> String {
return String(self.numberEnglish.prefix(mainPartLength))
}
public func region() -> String {
guard numberEnglish.count > mainPartLength else {
return ""
}
return String(self.numberEnglish.dropFirst(mainPartLength))
}
public var isValid: Bool {
number.count >= 8
}
public mutating func setNumber(_ number: String) {
self.number = number
self.numberEnglish = String(self.number.map { Constants.pnLettersMap[$0] ?? $0 })
}
// MARK: - UIKeyInput
public var hasText: Bool {
return !number.isEmpty
}
// Returns true if number was changed
@discardableResult
public mutating func insertText(_ text: String) -> Bool {
guard number.count < maxLength, text.count == 1 else {
return false
}
// TODO: Do proper validation
// if text.first?.isNumber == isDigitMask[number.count] {
// setNumber(number + text)
// return true
// } else {
// return false
// }
setNumber(number + text)
return true
}
@discardableResult
public mutating func deleteBackward() -> Bool {
guard !number.isEmpty else {
return false
}
setNumber(String(number.dropLast()))
return true
}
}