fun parseParameters()

in build-logic/generatorlegacybuild/src/main/kotlin/karakum/query/Parameters.kt [3:73]


fun parseParameters(source: String): List<String> {
    val params = source.substringAfter("(")
        .substringBefore("):")
        .takeIf { it.isNotEmpty() }
        ?: return emptyList()

    when (params) {
        "setup: (setFocused: (focused?: boolean) => void) => () => void",
        "setup: (setOnline: (online?: boolean) => void) => () => void",
            -> {
            val parameter = params
                .replace(" => ", " -> ")
                .replace("?: boolean", ": Boolean?")
                .replace("void", "Unit")

            return listOf(parameter)
        }

        "suspense: boolean | undefined, _useErrorBoundary: boolean | ((err: TError) => boolean) | undefined, error: TError",
            -> return params
            .replace(": boolean | ((", ": ((")
            .replace(" => ", " -> ")
            .replace(" boolean", " Boolean")
            .replace(" | undefined, ", "?, ")
            .split(", ")

        "options: QueryObserverOptions<TQueryFnData, TError, TData, TQueryData, TQueryKey, TPageParam> | DefaultedQueryObserverOptions<TQueryFnData, TError, TData, TQueryData, TQueryKey>",
            -> return listOf(
            "options: QueryObserverOptions<TQueryFnData, TError, TData, TQueryData, TQueryKey, TPageParam> /* | DefaultedQueryObserverOptions<TQueryFnData, TError, TData, TQueryData, TQueryKey> */"
        )

        "options: WithRequired<FetchQueryOptions<TQueryFnData, TError, TData, TQueryKey>, 'queryKey'>",
            -> return listOf(
            "options: FetchQueryOptions<TQueryFnData, TError, TData, TQueryKey> /* required 'queryKey' */",
        )

        "result: QueryObserverResult<TData, TError>, onPropTracked?: (key: keyof QueryObserverResult) => void",
            -> return listOf(
            "result: QueryObserverResult<TData, TError>",
            "onPropTracked: (key: String /* keyof QueryObserverResult */) -> Unit = definedExternally",
        )

        "fetchOptions: ObserverFetchOptions",
            -> return listOf(
            "fetchOptions: ObserverFetchOptions<TData>",
        )
    }

    val parts = params.split(": ")
    return sequenceOf(parts.first())
        .plus(
            parts.drop(1).dropLast(1).flatMap {
                sequenceOf(
                    it.substringBeforeLast(", "),
                    it.substringAfterLast(", ")
                )
            }
        )
        .plus(parts.last())
        .windowed(2, 2)
        .map { (nameSource, typeSource) ->
            val name = nameSource.removeSuffix("?")
            val type = kotlinType(typeSource, name).fixDefaultOptions()
            val de = if (nameSource.endsWith("?")) {
                " = definedExternally"
            } else ""

            "$name: $type $de"
        }
        .toList()
}