aboutsummaryrefslogtreecommitdiff
path: root/Map/MapParser/Strategies/VertexParserStrategy.swift
blob: 10c94a2c087e63ebea3c53679fd30aad191061e2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import Foundation

struct VertexParserStrategy: MapParserStrategy {
  private let regex = MapParsingPatterns.vertex

  func canHandle(line: String) -> Bool {
    let range = NSRange(location: 0, length: line.utf16.count)
    let matches = regex.matches(in: String(line), options: [], range: range)
    return matches.count > 0 && matches[0].numberOfRanges >= 4
  }

  func handle(index: Int, line: String, vertices: [String: Vertex]) -> (Any.Type, Any) {
    let range = NSRange(location: 0, length: line.utf16.count)
    let matches = regex.matches(in: String(line), options: [], range: range)

    let match = matches[0]
    let key = String(line[Range(match.range(at: 1), in: line)!])
    let xString = String(line[Range(match.range(at: 2), in: line)!])
    let yString = String(line[Range(match.range(at: 3), in: line)!])
    let x = CGFloat(truncating: NumberFormatter().number(from: xString) ?? 0.0)
    let y = CGFloat(truncating: NumberFormatter().number(from: yString) ?? 0.0)

    var vertex = Vertex(
      id: index,
      label: key,
      position: CGPoint(x: x, y: y)
    )

    if let range = Range(match.range(at: 4), in: line) {
      let shapeString = String(line[range])
      vertex.shape = VertexShape(rawValue: shapeString.lowercased()) ?? .circle
    }

    return (Vertex.self, vertex)
  }
}