aboutsummaryrefslogtreecommitdiff
path: root/Map/Extensions/Map+parse.swift
blob: 904f492cb49a063b0726b144b39c9caf305c375e (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
extension Map {
  static func parse(content: String) -> ParsedMap {

    let parsers = [
      AnyMapParserStrategy(VertexParserStrategy()),
      AnyMapParserStrategy(EdgeParserStrategy()),
      AnyMapParserStrategy(BlockerParserStrategy()),
      AnyMapParserStrategy(OpportunityParserStrategy()),
      AnyMapParserStrategy(StageParserStrategy()),
    ]
    let builder = MapBuilder()

    let lines = content.split(whereSeparator: \.isNewline)

    for (index, line) in lines.enumerated() {
      for parser in parsers {
        if parser.canHandle(line: String(line)) {
          let (type, object) = parser.handle(
            index: index, line: String(line), vertices: builder.vertices)
          builder.addObjectToMap(type: type, object: object)
          break
        }
      }
    }

    return builder.build()
  }
}