1+ import CoreLocation
12import Foundation
23import MapboxDirections
34import MapboxCommon
@@ -50,13 +51,13 @@ class RerouteController {
5051 return
5152 }
5253
53- defaultRerouteController. requestConfig = { [ weak delegate ] in
54- guard let delegate = delegate ,
55- let url = URL ( string : $0 ) ,
56- let options = RouteOptions ( url : url ) else {
54+ defaultRerouteController. requestConfig = { [ weak self ] in
55+ guard let self ,
56+ let delegate = self . delegate ,
57+ let routeOptions = self . options ( with : $0 ) else {
5758 return $0
5859 }
59- return NavigationSettings . shared. directions. url ( forCalculating: delegate. rerouteControllerWillModify ( options: options ) ) . absoluteString
60+ return NavigationSettings . shared. directions. url ( forCalculating: delegate. rerouteControllerWillModify ( options: routeOptions ) ) . absoluteString
6061 }
6162 }
6263 }
@@ -75,6 +76,7 @@ class RerouteController {
7576 private let rerouteDetector : RerouteDetectorInterface
7677
7778 private var reroutingRequest : NavigationProviderRequest ?
79+ private var initialOptions : RouteOptions ?
7880 private var latestRouteResponse : ( response: RouteResponse , options: RouteOptions ) ?
7981 private var isCancelled = false
8082
@@ -83,7 +85,12 @@ class RerouteController {
8385
8486 private weak var navigator : MapboxNavigationNative . Navigator ?
8587
88+ func set( initialOptions: RouteOptions ? ) {
89+ self . initialOptions = initialOptions
90+ }
91+
8692 func resetToDefaultSettings( ) {
93+ initialOptions = nil
8794 reroutesProactively = true
8895 isCancelled = false
8996 config. setAvoidManeuverSecondsForSeconds ( NSNumber ( value: Self . DefaultManeuverAvoidanceRadius) )
@@ -117,12 +124,21 @@ class RerouteController {
117124 deinit {
118125 invalidate ( )
119126 }
127+
128+ fileprivate var optionsType : RouteOptions . Type {
129+ initialOptions. map { Swift . type ( of: $0) } ?? RouteOptions . self
130+ }
131+
132+ fileprivate func options( with url: String ) -> RouteOptions ? {
133+ Self . decodeRouteOptions ( with: url, type: optionsType)
134+ }
120135}
121136
122137extension RerouteController : RerouteObserver {
123138 func onSwitchToAlternative( forRoute route: RouteInterface ) {
124139 guard let decoded = Self . decode ( routeRequest: route. getRequestUri ( ) ,
125- routeResponse: route. getResponseJsonRef ( ) ) else {
140+ routeResponse: route. getResponseJsonRef ( ) ,
141+ type: optionsType) else {
126142 return
127143 }
128144
@@ -143,7 +159,7 @@ extension RerouteController: RerouteObserver {
143159 func onRerouteReceived( forRouteResponse routeResponse: String , routeRequest: String , origin: RouterOrigin ) {
144160 guard reroutesProactively else { return }
145161
146- guard let decodedRequest = Self . decode ( routeRequest: routeRequest) else {
162+ guard let decodedRequest = Self . decode ( routeRequest: routeRequest, type : optionsType ) else {
147163 delegate? . rerouteControllerDidFailToReroute ( self , with: DirectionsError . invalidResponse ( nil ) )
148164 return
149165 }
@@ -191,17 +207,31 @@ extension RerouteController: RerouteObserver {
191207}
192208
193209extension RerouteController {
194- static internal func decode( routeRequest: String , routeResponse: DataRef ) -> ( routeOptions: RouteOptions , routeResponse: RouteResponse ) ? {
210+ internal func decode( routeRequest: String , routeResponse: DataRef )
211+ -> ( routeOptions: RouteOptions , routeResponse: RouteResponse ) ? {
212+ Self . decode ( routeRequest: routeRequest, routeResponse: routeResponse, type: optionsType)
213+ }
214+
215+ static internal func decode(
216+ routeRequest: String ,
217+ routeResponse: DataRef ,
218+ type: RouteOptions . Type
219+ ) -> ( routeOptions: RouteOptions , routeResponse: RouteResponse ) ? {
195220 var result : ( routeOptions: RouteOptions , routeResponse: RouteResponse ) ?
196221 routeResponse. withData { responseData in
197222 result = decode ( routeRequest: routeRequest,
198- routeResponse: responseData)
223+ routeResponse: responseData,
224+ type: type)
199225 }
200226 return result
201227 }
202228
203- static internal func decode( routeRequest: String , routeResponse: Data ) -> ( routeOptions: RouteOptions , routeResponse: RouteResponse ) ? {
204- guard let decodedRequest = decode ( routeRequest: routeRequest) ,
229+ static internal func decode(
230+ routeRequest: String ,
231+ routeResponse: Data ,
232+ type: RouteOptions . Type
233+ ) -> ( routeOptions: RouteOptions , routeResponse: RouteResponse ) ? {
234+ guard let decodedRequest = decode ( routeRequest: routeRequest, type: type) ,
205235 let decodedResponse = decode ( routeResponse: routeResponse,
206236 routeOptions: decodedRequest. routeOptions,
207237 credentials: decodedRequest. credentials) else {
@@ -211,9 +241,12 @@ extension RerouteController {
211241 return ( decodedRequest. routeOptions, decodedResponse)
212242 }
213243
214- static internal func decode( routeRequest: String ) -> ( routeOptions: RouteOptions , credentials: Credentials ) ? {
244+ static internal func decode(
245+ routeRequest: String ,
246+ type: RouteOptions . Type
247+ ) -> ( routeOptions: RouteOptions , credentials: Credentials ) ? {
215248 guard let requestURL = URL ( string: routeRequest) ,
216- let routeOptions = RouteOptions ( url : requestURL ) else {
249+ let routeOptions = decodeRouteOptions ( with : routeRequest , type : type ) else {
217250 return nil
218251 }
219252
@@ -231,6 +264,14 @@ extension RerouteController {
231264 return try ? decoder. decode ( RouteResponse . self,
232265 from: routeResponse)
233266 }
267+
268+ static func decodeRouteOptions(
269+ with routeRequest: String ,
270+ type: RouteOptions . Type
271+ ) -> RouteOptions ? {
272+ let url = URL ( string: routeRequest)
273+ return url? . routeOptions ( with: type)
274+ }
234275}
235276
236277extension RerouteController : RerouteControllerInterface {
@@ -246,13 +287,13 @@ extension RerouteController: RerouteControllerInterface {
246287 type: . routerError) ) )
247288 return
248289 }
249-
250- guard let routeOptions = RouteOptions ( url : URL ( string : url) ! ) else {
290+
291+ guard let routeOptions = options ( with : url) else {
251292 callback ( . init( error: RerouteError ( message: " Unable to decode route request for rerouting. " ,
252293 type: . routerError) ) )
253294 return
254295 }
255-
296+
256297 reroutingRequest = customRoutingProvider. calculateRoutes ( options: routeOptions) { [ weak self] result in
257298 guard let self = self else { return }
258299
@@ -281,3 +322,15 @@ extension RerouteController: RerouteControllerInterface {
281322 reroutingRequest? . cancel ( )
282323 }
283324}
325+
326+ extension URL {
327+ func routeOptions( with type: RouteOptions . Type ) -> RouteOptions ? {
328+ guard let baseOptions = RouteOptions ( url: self ) else {
329+ return nil
330+ }
331+ let profileIdentifier = baseOptions. profileIdentifier
332+ let waypoints = baseOptions. waypoints
333+ let queryItems = URLComponents ( url: self , resolvingAgainstBaseURL: true ) ? . queryItems
334+ return type. init ( waypoints: waypoints, profileIdentifier: profileIdentifier, queryItems: queryItems)
335+ }
336+ }
0 commit comments