diff --git a/app/src/main/java/com/example/nav3recipes/deeplink/basic/util/DeepLinkMatcher.kt b/app/src/main/java/com/example/nav3recipes/deeplink/basic/util/DeepLinkMatcher.kt index 1c6f3d8..989bc66 100644 --- a/app/src/main/java/com/example/nav3recipes/deeplink/basic/util/DeepLinkMatcher.kt +++ b/app/src/main/java/com/example/nav3recipes/deeplink/basic/util/DeepLinkMatcher.kt @@ -48,14 +48,14 @@ internal class DeepLinkMatcher( // match queries (if any) request.queries.forEach { query -> val name = query.key - val queryStringParser = deepLinkPattern.queryValueParsers[name] - val queryParsedValue = try { - queryStringParser!!.invoke(query.value) + val queryParameter = deepLinkPattern.queryParameters[name]!! + val (argName, parsedValue) = try { + Pair(queryParameter.serialName ?: name, queryParameter.typeParser.invoke(query.value)) } catch (e: IllegalArgumentException) { Log.e(TAG_LOG_ERROR, "Failed to parse query name:[$name] value:[${query.value}].", e) return null } - args[name] = queryParsedValue + args[argName] = parsedValue } // provide the serializer of the matching key and map of arg names to parsed arg values return DeepLinkMatchResult(deepLinkPattern.serializer, args) diff --git a/app/src/main/java/com/example/nav3recipes/deeplink/basic/util/DeepLinkPattern.kt b/app/src/main/java/com/example/nav3recipes/deeplink/basic/util/DeepLinkPattern.kt index 9bcf5f5..7d8bbf2 100644 --- a/app/src/main/java/com/example/nav3recipes/deeplink/basic/util/DeepLinkPattern.kt +++ b/app/src/main/java/com/example/nav3recipes/deeplink/basic/util/DeepLinkPattern.kt @@ -72,15 +72,16 @@ internal class DeepLinkPattern( } /** - * Parse supported queries into a map of queryParameterNames to [TypeParser] + * Parse supported queries into a map of queryParameterNames to [QueryParameter] * * This will be used later on to parse a provided query value into the correct KType */ - val queryValueParsers: Map = buildMap { + val queryParameters: Map = buildMap { uriPattern.queryParameterNames.forEach { paramName -> - val elementIndex = serializer.descriptor.getElementIndex(paramName) + val paramValue = uriPattern.getQueryParameter(paramName)?.removePrefix("{")?.removeSuffix("}") + val elementIndex = serializer.descriptor.getElementIndex(paramValue ?: paramName) val elementDescriptor = serializer.descriptor.getElementDescriptor(elementIndex) - this[paramName] = getTypeParser(elementDescriptor.kind) + this[paramName] = QueryParameter(paramValue, getTypeParser(elementDescriptor.kind)) } } @@ -92,6 +93,14 @@ internal class DeepLinkPattern( val isParamArg: Boolean, val typeParser: TypeParser ) + + /** + * Metadata about a supported query parameter + */ + class QueryParameter( + val serialName: String?, + val typeParser: TypeParser, + ) } /**