Skip to content
This repository has been archived by the owner on Mar 18, 2024. It is now read-only.

Added inline-serialization example #23

Open
wants to merge 4 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 31 additions & 0 deletions inline-serialization/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# inline-serialization-plugin
A Kotlin compiler plugin for inline serialization, implemented with ΛRROW Meta.

## Notes
*This plug-in is not a polished product meant to be reused in other projects.*

The current version of this plug-in based against on Kotlin 1.3.61 and Serialization Runtime 0.14.0.

Kotlin 1.3.70+ and thus Serialization Runtime 0.20.0 are not supported by ΛRROW Meta, at the moment (https://github.com/arrow-kt/arrow-meta/issues/554).

This plug-in project is derived by the original `hello-world` plug-in example by the ΛRROW Meta team.

## Plug-in description and project structure
The plug-in is implemented in the `inline-serialization-plugin` module.

Inline serialization is enabled using the `@InlineSerializable` annotation, defined in the `inline-serialization` module.

For each class `a.b.c.Xyz` annotated with `@InlineSerializable`, the plug-in generates a serializer `XyzSerializer`, implementing inline serialization, in package `a.b.c.inline_serialization`, and also annotates the class with `@Serializable(with=a.b.c.inline_serialization.XyzSerializer::class)`.

In this case, we annotated two classes in the library implemented in module `example-library`. The compiler plugin is invoked during the build of this module. This library is then used by the application in module `example-application`.

## Usage
### Build
From the console:

```./gradlew clean :example-application:shadowJar```

### Run
From the console:

```java -jar example-application/build/libs/example-application-all.jar```
28 changes: 28 additions & 0 deletions inline-serialization/build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
buildscript {
repositories {
jcenter()
maven { url "https://plugins.gradle.org/m2/" }
maven { url "https://kotlin.bintray.com/kotlinx" }
mavenCentral()
maven { url 'https://oss.jfrog.org/artifactory/oss-snapshot-local/' }
}

dependencies {
classpath "org.jetbrains.kotlin:kotlin-serialization:$KOTLIN_VERSION"

classpath "io.arrow-kt:gradle-plugin:$ARROW_META_VERSION"
classpath "io.arrow-kt:compiler-plugin:$ARROW_META_VERSION"
}
}

plugins {
id "org.jetbrains.kotlin.jvm" version "$KOTLIN_VERSION" apply false
id "com.github.johnrengelman.shadow" version "$SHADOW_JAR_VERSION" apply false
}

allprojects {
repositories {
mavenCentral()
maven { url 'https://oss.jfrog.org/artifactory/oss-snapshot-local/' }
}
}
38 changes: 38 additions & 0 deletions inline-serialization/example-application/build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
plugins {
id "org.jetbrains.kotlin.jvm"
id "com.github.johnrengelman.shadow"
id "kotlinx-serialization"
}

dependencies {
compileOnly "org.jetbrains.kotlin:kotlin-stdlib:$KOTLIN_VERSION"

compileOnly "org.jetbrains.kotlinx:kotlinx-serialization-runtime:$kotlinx_serialization_runtime_version"
compileOnly "org.jetbrains.kotlin:kotlin-reflect:$KOTLIN_VERSION"

compileOnly project(":example-library")
}

compileKotlin {
kotlinOptions {
jvmTarget = "$JVM_TARGET_VERSION"
}
}

compileTestKotlin {
kotlinOptions {
jvmTarget = "$JVM_TARGET_VERSION"
}
}

shadowJar {
configurations = [project.configurations.compileOnly]
}

jar {
manifest {
attributes(
"Main-Class": "io.arrowkt.example.inline_serialization.example_application.MainKt"
)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package io.arrowkt.example.inline_serialization.example_application

import kotlinx.serialization.Serializable

import io.arrowkt.example.inline_serialization.example_library.ChannelCount

@Serializable
data class Info(
val channelCount: ChannelCount,
val sampleRate: SampleRateHz
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package io.arrowkt.example.inline_serialization.example_application

import kotlinx.serialization.json.Json
import kotlinx.serialization.json.JsonConfiguration

import io.arrowkt.example.inline_serialization.example_library.ChannelCount
import io.arrowkt.example.inline_serialization.example_library.UserId

fun main(args : Array<String>) {
val stereo = ChannelCount(2)
val mono = ChannelCount(1)
val tri = stereo + mono

println(tri)

val userId1 = UserId.unique()

println(userId1)

val sampleRate = SampleRateHz(44100)

println(sampleRate)

val info = Info(stereo, sampleRate)

println(info)

val json = Json(JsonConfiguration.Stable)

println(json.stringify(ChannelCount.serializer(), tri))
println(json.stringify(SampleRateHz.serializer(), sampleRate))
println(json.stringify(Info.serializer(), info))
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package io.arrowkt.example.inline_serialization.example_application

import kotlinx.serialization.*
import kotlinx.serialization.internal.*

@Serializable(with = SampleRateHzSerializer::class)
data class SampleRateHz(val value : Int) {
override fun toString(): String = "$value hz"
}

@Serializer(forClass = SampleRateHz::class)
class SampleRateHzSerializer : KSerializer<SampleRateHz> {
override val descriptor: SerialDescriptor =
IntDescriptor.withName(SampleRateHz::class.java.simpleName)
//PrimitiveDescriptor(SampleRateHz::class.java.simpleName, PrimitiveKind.INT)

//override fun serialize(encoder: Encoder, value: SampleRateHz) {
// encoder.encodeInt(value.value)
override fun serialize(encoder: Encoder, obj: SampleRateHz) {
encoder.encodeInt(obj.value)
}

override fun deserialize(decoder: Decoder): SampleRateHz {
return SampleRateHz(decoder.decodeInt())
}
}
37 changes: 37 additions & 0 deletions inline-serialization/example-library/build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
plugins {
id "org.jetbrains.kotlin.jvm"
id "com.github.johnrengelman.shadow"
id "kotlinx-serialization"
}

dependencies {
compileOnly "org.jetbrains.kotlin:kotlin-stdlib:$KOTLIN_VERSION"

compileOnly "org.jetbrains.kotlinx:kotlinx-serialization-runtime:$kotlinx_serialization_runtime_version"
compileOnly "org.jetbrains.kotlin:kotlin-reflect:$KOTLIN_VERSION"

compileOnly "io.arrow-kt:arrow-annotations:$ARROW_VERSION"

// To run :inline-serialization-plugin:shadowJar when building this project
api project(path: ':inline-serialization-plugin', configuration: 'shadow')
api project(":inline-serialization")
}

compileKotlin {
kotlinOptions {
jvmTarget = "$JVM_TARGET_VERSION"
freeCompilerArgs = [
"-Xplugin=${project.rootDir}/inline-serialization-plugin/build/libs/inline-serialization-plugin-all.jar"
]
}
}

compileTestKotlin {
kotlinOptions {
jvmTarget = "$JVM_TARGET_VERSION"
}
}

shadowJar {
configurations = [project.configurations.compileOnly]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package io.arrowkt.example.inline_serialization.example_library

import io.arrowkt.example.inline_serialization.inline_serialization.InlineSerializable

//metadebug

@InlineSerializable
data class ChannelCount(val value : Int) {
override fun toString(): String = "$value channels"

operator fun plus(other : ChannelCount) =
ChannelCount(value + other.value)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package io.arrowkt.example.inline_serialization.example_library

import io.arrowkt.example.inline_serialization.inline_serialization.InlineSerializable

@InlineSerializable
data class UserId(val value : String) {
companion object {
fun unique() =
UserId(java.util.UUID.randomUUID().toString())
}

override fun toString(): String = "UserId($value)"
}
8 changes: 8 additions & 0 deletions inline-serialization/gradle.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
KOTLIN_VERSION=1.3.61
KOTLIN_TEST_VERSION=3.4.2
JVM_TARGET_VERSION=1.8
ARROW_VERSION=0.10.5
ARROW_META_VERSION=1.3.61-SNAPSHOT
SHADOW_JAR_VERSION=5.2.0

kotlinx_serialization_runtime_version=0.14.0
Binary file not shown.
6 changes: 6 additions & 0 deletions inline-serialization/gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
#Mon May 04 15:27:16 CEST 2020
distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStorePath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
Loading