-
Notifications
You must be signed in to change notification settings - Fork 437
/
optional.kt
38 lines (34 loc) · 1.5 KB
/
optional.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
package arrow.optics.plugin.internals
internal fun generateOptionals(ele: ADT, target: OptionalTarget) =
Snippet(
`package` = ele.packageName,
name = ele.simpleName,
imports =
setOf("import arrow.core.left", "import arrow.core.right", "import arrow.core.toOption"),
content = processElement(ele, target.foci)
)
private fun processElement(ele: ADT, foci: List<Focus>): String =
foci.joinToString(separator = "\n") { focus ->
fun getOrModifyF(toNullable: String = "") =
"{ ${ele.sourceName}: ${ele.sourceClassName} -> ${ele.sourceName}.${
focus.paramName.plusIfNotBlank(
prefix = "`",
postfix = "`"
)
}$toNullable?.right() ?: ${ele.sourceName}.left() }"
fun setF(fromNullable: String = "") =
"${ele.sourceName}.copy(${focus.paramName.plusIfNotBlank(prefix = "`", postfix = "`")} = value$fromNullable)"
val (targetClassName, getOrModify, set) =
when (focus) {
is NullableFocus -> Triple(focus.nonNullClassName, getOrModifyF(), setF())
is OptionFocus ->
Triple(focus.nestedClassName, getOrModifyF(".orNull()"), setF(".toOption()"))
is NonNullFocus -> return@joinToString ""
}
"""
|inline val ${ele.sourceClassName}.Companion.${focus.paramName}: $Optional<${ele.sourceClassName}, $targetClassName> inline get()= $Optional(
| getOrModify = $getOrModify,
| set = { ${ele.sourceName}: ${ele.sourceClassName}, value: $targetClassName -> $set }
|)
|""".trimMargin()
}