Skip to content

Commit

Permalink
Add roadSide to RouteStep
Browse files Browse the repository at this point in the history
  • Loading branch information
frederoni committed Dec 4, 2017
1 parent d9eb04c commit 26c6dbd
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 5 deletions.
49 changes: 45 additions & 4 deletions MapboxDirections/MBRouteStep.swift
Original file line number Diff line number Diff line change
Expand Up @@ -421,6 +421,35 @@ public enum ManeuverDirection: Int, CustomStringConvertible {
}
}

@objc(MBRoadSide)
public enum RoadSide: Int, CustomStringConvertible {
case left
case right

public init?(description: String) {
var side: RoadSide
switch description {
case "left":
side = .left
case "right":
side = .right
default:
return nil
}

self.init(rawValue: side.rawValue)
}

public var description: String {
switch self {
case .left:
return "left"
case .right:
return "right"
}
}
}

extension String {
internal func tagValues(separatedBy separator: String) -> [String] {
return components(separatedBy: separator).map { $0.trimmingCharacters(in: .whitespaces) }.filter { !$0.isEmpty }
Expand Down Expand Up @@ -488,7 +517,7 @@ struct Road {
open class RouteStep: NSObject, NSSecureCoding {
// MARK: Creating a Step

internal init(finalHeading: CLLocationDirection?, maneuverType: ManeuverType?, maneuverDirection: ManeuverDirection?, maneuverLocation: CLLocationCoordinate2D, name: String, coordinates: [CLLocationCoordinate2D]?, json: JSONDictionary) {
internal init(finalHeading: CLLocationDirection?, maneuverType: ManeuverType?, maneuverDirection: ManeuverDirection?, roadSide: RoadSide?, maneuverLocation: CLLocationCoordinate2D, name: String, coordinates: [CLLocationCoordinate2D]?, json: JSONDictionary) {
transportType = TransportType(description: json["mode"] as! String)

let road = Road(name: name, ref: json["ref"] as? String, exits: json["exits"] as? String, destination: json["destinations"] as? String, rotaryName: json["rotary_name"] as? String)
Expand Down Expand Up @@ -542,6 +571,7 @@ open class RouteStep: NSObject, NSSecureCoding {

self.maneuverLocation = maneuverLocation
self.coordinates = coordinates
self.roadSide = roadSide
}

/**
Expand All @@ -557,6 +587,7 @@ open class RouteStep: NSObject, NSSecureCoding {
let maneuverType = ManeuverType(description: maneuver["type"] as! String)
let maneuverDirection = ManeuverDirection(description: maneuver["modifier"] as? String ?? "")
let maneuverLocation = CLLocationCoordinate2D(geoJSON: maneuver["location"] as! [Double])
let roadSide = RoadSide(description: json["driving_side"] as? String ?? "")

let name = json["name"] as! String

Expand All @@ -570,7 +601,7 @@ open class RouteStep: NSObject, NSSecureCoding {
coordinates = nil
}

self.init(finalHeading: finalHeading, maneuverType: maneuverType, maneuverDirection: maneuverDirection, maneuverLocation: maneuverLocation, name: name, coordinates: coordinates, json: json)
self.init(finalHeading: finalHeading, maneuverType: maneuverType, maneuverDirection: maneuverDirection, roadSide: roadSide, maneuverLocation: maneuverLocation, name: name, coordinates: coordinates, json: json)
}

public required init?(coder decoder: NSCoder) {
Expand Down Expand Up @@ -602,6 +633,13 @@ open class RouteStep: NSObject, NSSecureCoding {
maneuverDirection = nil
}

if let roadSideDescription = decoder.decodeObject(of: NSString.self, forKey: "roadSide") as String?,
let roadSide = RoadSide(description: roadSideDescription) {
self.roadSide = roadSide
} else {
self.roadSide = nil
}

if let maneuverLocationDictionary = decoder.decodeObject(of: [NSDictionary.self, NSString.self, NSNumber.self], forKey: "maneuverLocation") as? [String: CLLocationDegrees],
let latitude = maneuverLocationDictionary["latitude"],
let longitude = maneuverLocationDictionary["longitude"] {
Expand Down Expand Up @@ -655,6 +693,7 @@ open class RouteStep: NSObject, NSSecureCoding {

coder.encode(maneuverType?.description, forKey: "maneuverType")
coder.encode(maneuverDirection?.description, forKey: "maneuverDirection")
coder.encode(roadSide?.description, forKey: "roadSide")

coder.encode(intersections, forKey: "intersections")

Expand Down Expand Up @@ -704,6 +743,8 @@ open class RouteStep: NSObject, NSSecureCoding {
return UInt(coordinates?.count ?? 0)
}

open let roadSide: RoadSide?

/**
Retrieves the coordinates.
Expand Down Expand Up @@ -952,10 +993,10 @@ internal class RouteStepV4: RouteStep {
let maneuverType = ManeuverType(v4Description: maneuver["type"] as! String)
let maneuverDirection = ManeuverDirection(v4TypeDescription: maneuver["type"] as! String)
let maneuverLocation = CLLocationCoordinate2D(geoJSON: maneuver["location"] as! JSONDictionary)

let roadSide = RoadSide(description: json["driving_side"] as? String ?? "")
let name = json["way_name"] as! String

self.init(finalHeading: heading, maneuverType: maneuverType, maneuverDirection: maneuverDirection, maneuverLocation: maneuverLocation, name: name, coordinates: nil, json: json)
self.init(finalHeading: heading, maneuverType: maneuverType, maneuverDirection: maneuverDirection, roadSide: roadSide, maneuverLocation: maneuverLocation, name: name, coordinates: nil, json: json)
}
}

Expand Down
3 changes: 2 additions & 1 deletion MapboxDirectionsTests/RouteStepTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,7 @@ class RouteStepTests: XCTestCase {
"pronunciation": "ˈaɪˌfoʊ̯n ˈtɛn",
] as [String: Any]

let step = RouteStep(finalHeading: 59, maneuverType: .reachFork, maneuverDirection: .left, maneuverLocation: CLLocationCoordinate2D(latitude: 37.853913, longitude: -122.220694), name: "", coordinates: coordinates, json: json)
let step = RouteStep(finalHeading: 59, maneuverType: .reachFork, maneuverDirection: .left, roadSide: .left, maneuverLocation: CLLocationCoordinate2D(latitude: 37.853913, longitude: -122.220694), name: "", coordinates: coordinates, json: json)

// Encode and decode the route step securely
// This may raise an Obj-C exception if an error is encountered which will fail the tests
Expand Down Expand Up @@ -158,5 +158,6 @@ class RouteStepTests: XCTestCase {
XCTAssertEqual(unarchivedStep.destinations ?? [], step.destinations ?? [])
XCTAssertEqual(unarchivedStep.instructionsSpokenAlongStep ?? [], step.instructionsSpokenAlongStep ?? [])
XCTAssertEqual(unarchivedStep.instructionsDisplayedAlongStep ?? [], step.instructionsDisplayedAlongStep ?? [])
XCTAssertEqual(unarchivedStep.roadSide, RoadSide.left)
}
}

0 comments on commit 26c6dbd

Please sign in to comment.