Browse Source

Make RSocketRequester extensions reified

Extension functions need to use reified types to create
ParameterizedTypeReference.

Closes gh-23185
pull/23255/head
slawluc 7 years ago committed by Sebastien Deleuze
parent
commit
4bced4682a
  1. 10
      spring-messaging/src/main/kotlin/org/springframework/messaging/rsocket/RSocketRequesterExtensions.kt
  2. 14
      spring-messaging/src/test/kotlin/org/springframework/messaging/rsocket/RSocketRequesterExtensionsTests.kt

10
spring-messaging/src/main/kotlin/org/springframework/messaging/rsocket/RSocketRequesterExtensions.kt

@ -64,7 +64,7 @@ suspend fun RSocketRequester.Builder.connectWebSocketAndAwait(uri: URI): RSocket
*/ */
@Suppress("EXTENSION_SHADOWED_BY_MEMBER") @Suppress("EXTENSION_SHADOWED_BY_MEMBER")
@FlowPreview @FlowPreview
fun <T : Any> RSocketRequester.RequestSpec.data(producer: Any): RSocketRequester.ResponseSpec = inline fun <reified T : Any> RSocketRequester.RequestSpec.data(producer: Any): RSocketRequester.ResponseSpec =
data(producer, object : ParameterizedTypeReference<T>() {}) data(producer, object : ParameterizedTypeReference<T>() {})
/** /**
@ -83,7 +83,7 @@ suspend fun RSocketRequester.ResponseSpec.sendAndAwait() {
* @author Sebastien Deleuze * @author Sebastien Deleuze
* @since 5.2 * @since 5.2
*/ */
suspend fun <T : Any> RSocketRequester.ResponseSpec.retrieveAndAwait(): T = suspend inline fun <reified T : Any> RSocketRequester.ResponseSpec.retrieveAndAwait(): T =
retrieveMono(object : ParameterizedTypeReference<T>() {}).awaitSingle() retrieveMono(object : ParameterizedTypeReference<T>() {}).awaitSingle()
/** /**
@ -93,7 +93,7 @@ suspend fun <T : Any> RSocketRequester.ResponseSpec.retrieveAndAwait(): T =
* @since 5.2 * @since 5.2
*/ */
@FlowPreview @FlowPreview
fun <T : Any> RSocketRequester.ResponseSpec.retrieveFlow(batchSize: Int = 1): Flow<T> = inline fun <reified T : Any> RSocketRequester.ResponseSpec.retrieveFlow(batchSize: Int = 1): Flow<T> =
retrieveFlux(object : ParameterizedTypeReference<T>() {}).asFlow(batchSize) retrieveFlux(object : ParameterizedTypeReference<T>() {}).asFlow(batchSize)
/** /**
@ -104,7 +104,7 @@ fun <T : Any> RSocketRequester.ResponseSpec.retrieveFlow(batchSize: Int = 1): Fl
* @author Sebastien Deleuze * @author Sebastien Deleuze
* @since 5.2 * @since 5.2
*/ */
fun <T : Any> RSocketRequester.ResponseSpec.retrieveMono(): Mono<T> = inline fun <reified T : Any> RSocketRequester.ResponseSpec.retrieveMono(): Mono<T> =
retrieveMono(object : ParameterizedTypeReference<T>() {}) retrieveMono(object : ParameterizedTypeReference<T>() {})
@ -116,5 +116,5 @@ fun <T : Any> RSocketRequester.ResponseSpec.retrieveMono(): Mono<T> =
* @author Sebastien Deleuze * @author Sebastien Deleuze
* @since 5.2 * @since 5.2
*/ */
fun <T : Any> RSocketRequester.ResponseSpec.retrieveFlux(): Flux<T> = inline fun <reified T : Any> RSocketRequester.ResponseSpec.retrieveFlux(): Flux<T> =
retrieveFlux(object : ParameterizedTypeReference<T>() {}) retrieveFlux(object : ParameterizedTypeReference<T>() {})

14
spring-messaging/src/test/kotlin/org/springframework/messaging/rsocket/RSocketRequesterExtensionsTests.kt

@ -21,6 +21,8 @@ import reactor.core.publisher.Mono
@FlowPreview @FlowPreview
class RSocketRequesterExtensionsTests { class RSocketRequesterExtensionsTests {
private val stringTypeRefMatcher: (ParameterizedTypeReference<*>) -> Boolean = { it.type == String::class.java }
@Test @Test
fun connectAndAwait() { fun connectAndAwait() {
val requester = mockk<RSocketRequester>() val requester = mockk<RSocketRequester>()
@ -56,7 +58,7 @@ class RSocketRequesterExtensionsTests {
fun dataFlowWithType() { fun dataFlowWithType() {
val requestSpec = mockk<RSocketRequester.RequestSpec>() val requestSpec = mockk<RSocketRequester.RequestSpec>()
val responseSpec = mockk<RSocketRequester.ResponseSpec>() val responseSpec = mockk<RSocketRequester.ResponseSpec>()
every { requestSpec.data(any<Publisher<String>>(), any<ParameterizedTypeReference<String>>()) } returns responseSpec every { requestSpec.data(any<Publisher<String>>(), match<ParameterizedTypeReference<*>>(stringTypeRefMatcher)) } returns responseSpec
assertEquals(responseSpec, requestSpec.data<String>(mockk())) assertEquals(responseSpec, requestSpec.data<String>(mockk()))
} }
@ -81,16 +83,16 @@ class RSocketRequesterExtensionsTests {
fun retrieveAndAwait() { fun retrieveAndAwait() {
val response = "foo" val response = "foo"
val responseSpec = mockk<RSocketRequester.ResponseSpec>() val responseSpec = mockk<RSocketRequester.ResponseSpec>()
every { responseSpec.retrieveMono(any<ParameterizedTypeReference<String>>()) } returns Mono.just("foo") every { responseSpec.retrieveMono(match<ParameterizedTypeReference<*>>(stringTypeRefMatcher)) } returns Mono.just("foo")
runBlocking { runBlocking {
assertEquals(response, responseSpec.retrieveAndAwait()) assertEquals(response, responseSpec.retrieveAndAwait<String>())
} }
} }
@Test @Test
fun retrieveFlow() { fun retrieveFlow() {
val responseSpec = mockk<RSocketRequester.ResponseSpec>() val responseSpec = mockk<RSocketRequester.ResponseSpec>()
every { responseSpec.retrieveFlux(any<ParameterizedTypeReference<String>>()) } returns Flux.just("foo", "bar") every { responseSpec.retrieveFlux(match<ParameterizedTypeReference<*>>(stringTypeRefMatcher)) } returns Flux.just("foo", "bar")
runBlocking { runBlocking {
assertEquals(listOf("foo", "bar"), responseSpec.retrieveFlow<String>().toList()) assertEquals(listOf("foo", "bar"), responseSpec.retrieveFlow<String>().toList())
} }
@ -99,7 +101,7 @@ class RSocketRequesterExtensionsTests {
@Test @Test
fun retrieveMono() { fun retrieveMono() {
val responseSpec = mockk<RSocketRequester.ResponseSpec>() val responseSpec = mockk<RSocketRequester.ResponseSpec>()
every { responseSpec.retrieveMono(any<ParameterizedTypeReference<String>>()) } returns Mono.just("foo") every { responseSpec.retrieveMono(match<ParameterizedTypeReference<*>>(stringTypeRefMatcher)) } returns Mono.just("foo")
runBlocking { runBlocking {
assertEquals("foo", responseSpec.retrieveMono<String>().block()) assertEquals("foo", responseSpec.retrieveMono<String>().block())
} }
@ -108,7 +110,7 @@ class RSocketRequesterExtensionsTests {
@Test @Test
fun retrieveFlux() { fun retrieveFlux() {
val responseSpec = mockk<RSocketRequester.ResponseSpec>() val responseSpec = mockk<RSocketRequester.ResponseSpec>()
every { responseSpec.retrieveFlux(any<ParameterizedTypeReference<String>>()) } returns Flux.just("foo", "bar") every { responseSpec.retrieveFlux(match<ParameterizedTypeReference<*>>(stringTypeRefMatcher)) } returns Flux.just("foo", "bar")
runBlocking { runBlocking {
assertEquals(listOf("foo", "bar"), responseSpec.retrieveFlux<String>().collectList().block()) assertEquals(listOf("foo", "bar"), responseSpec.retrieveFlux<String>().collectList().block())
} }

Loading…
Cancel
Save