This presentation is part of a workshop series.
In this section you will learn about custom DSLs, what they are useful for and how to build them.
License:
This presentation is licensed under the Creative Commons, No Derivatives, Version 3.0 US: https://creativecommons.org/licenses/by-nd/3.0/us/legalcode
5. MockResponse mockResponse = new MockResponseBuilder()
.withCode(200)
.withHeader("Content-Type", "application/json")
.withBody(new Buffer()...)
.build();
public class MockResponseBuilder {
public MockResponseBuilder withCode(int code) {}
public MockResponseBuilder withHeader(String name,
String value) {}
public MockResponseBuilder withBody(Buffer body) {}
public MockResponse build() {}
}
Why DSLs?
DSLs
y/kotlin-workbook
6. val mockResponse = mockResponse {
code(200)
header("Content-Type", "application/json")
body {
readFromTestAsset("success.json")
}
}
MockResponse mockResponse = new MockResponseBuilder()
.withCode(200)
.withHeader("Content-Type", "application/json")
.withBody(new Buffer()...)
.build();
public class MockResponseBuilder {
public MockResponseBuilder withCode(int code) {}
public MockResponseBuilder withHeader(String name,
String value) {}
public MockResponseBuilder withBody(Buffer body) {}
public MockResponse build() {}
}
Why DSLs?
DSLs
y/kotlin-workbook
7. val mockResponse = mockResponse {
code(200)
header("Content-Type", "application/json")
body {
readFromTestAsset("success.json")
}
}
fun mockResponse(
init: MockResponseBuilder.() -> Unit
): MockResponse {
return MockResponseBuilder().apply(init).build()
}
public class MockResponseBuilder {
public MockResponseBuilder withCode(int code) {}
public MockResponseBuilder withHeader(String name,
String value) {}
public MockResponseBuilder withBody(Buffer body) {}
public MockResponse build() {}
}
DSL How To
DSLs
y/kotlin-workbook
8. val mockResponse = mockResponse {
code(200)
header("Content-Type", "application/json")
body {
readFromTestAsset("success.json")
}
}
fun mockResponse(
init: MockResponseBuilder.() -> Unit
): MockResponse {
return MockResponseBuilder().apply(init).build()
}
class MockResponseBuilder internal constructor() {
fun code(code: Int)
fun header(name: String, value: String)
fun body(init: Buffer.() -> Unit)
internal fun build(): MockResponse
}
DSL How To
DSLs
y/kotlin-workbook
9. val mockResponse = mockResponse {
code(200)
header("Content-Type", "application/json")
body {
readFromTestAsset("success.json")
}
}
fun mockResponse(
init: MockResponseBuilder.() -> Unit
): MockResponse {
return MockResponseBuilder().apply(init).build()
}
fun Buffer.readFromTestAsset(responseJsonPath: String)
class MockResponseBuilder internal constructor() {
fun code(code: Int)
fun header(name: String, value: String)
fun body(init: Buffer.() -> Unit)
internal fun build(): MockResponse
}
DSL How To
DSLs
y/kotlin-workbook
10. val mockResponse = mockResponse {
code(200)
header("Content-Type", "application/json")
body {
readFromTestAsset("success.json")
}
}
fun mockResponse(
init: MockResponseBuilder.() -> Unit
): MockResponse {
return MockResponseBuilder().apply(init).build()
}
fun Buffer.readFromTestAsset(responseJsonPath: String)
@DslMarker annotation class MockResponseDsl
@MockResponseDsl
class MockResponseBuilder internal constructor() {
fun code(code: Int)
fun header(name: String, value: String)
fun body(init: Buffer.() -> Unit)
internal fun build(): MockResponse
}
DSL How To
DSLs
y/kotlin-workbook