Skip to content

Commit 0d4a6a9

Browse files
Copy-paste the Learn DSL code
1 parent 5701598 commit 0d4a6a9

File tree

8 files changed

+739
-3
lines changed

8 files changed

+739
-3
lines changed

gradle/libs.versions.toml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ kotest = "5.9.1"
88
[libraries]
99
kotlin-test = { module = "org.jetbrains.kotlin:kotlin-test", version.ref = "kotlin" }
1010
kotest-assertions = { module = "io.kotest:kotest-assertions-core", version.ref = "kotest" }
11+
kotlin-serialization = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json", version = "1.7.3" }
1112

1213
[bundles]
1314
test = [
@@ -18,4 +19,5 @@ test = [
1819
[plugins]
1920
androidLibrary = { id = "com.android.library", version.ref = "agp" }
2021
kotlinMultiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin" }
21-
publish = { id = "com.vanniktech.maven.publish", version = "0.29.0" }
22+
publish = { id = "com.vanniktech.maven.publish", version = "0.29.0" }
23+
kotlinSerialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" }

learn-dsl/build.gradle.kts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ plugins {
66
alias(libs.plugins.kotlinMultiplatform)
77
alias(libs.plugins.androidLibrary)
88
alias(libs.plugins.publish)
9+
alias(libs.plugins.kotlinSerialization)
910
}
1011

1112
kotlin {
@@ -30,7 +31,7 @@ kotlin {
3031
sourceSets {
3132
val commonMain by getting {
3233
dependencies {
33-
//put your multiplatform dependencies here
34+
implementation(libs.kotlin.serialization)
3435
}
3536
}
3637
val commonTest by getting {
@@ -43,7 +44,7 @@ kotlin {
4344
}
4445

4546
android {
46-
namespace = "com.ivy_apps.learn.dsl"
47+
namespace = "com.ivy_apps.learn"
4748
compileSdk = libs.versions.android.compileSdk.get().toInt()
4849
defaultConfig {
4950
minSdk = libs.versions.android.minSdk.get().toInt()
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package ivy.learn
2+
3+
import kotlinx.serialization.Serializable
4+
import kotlin.jvm.JvmInline
5+
6+
@Serializable
7+
data class Course(
8+
override val id: CourseId,
9+
val name: String,
10+
val tagline: String,
11+
val image: ImageUrl,
12+
val lessons: List<LessonId>,
13+
) : Identifiable<CourseId>
14+
15+
@Serializable
16+
@JvmInline
17+
value class CourseId(override val value: String) : Id
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package ivy.learn
2+
3+
interface Identifiable<AId : Id> {
4+
val id: AId
5+
}
6+
7+
interface Id {
8+
val value: String
9+
}
Lines changed: 172 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,172 @@
1+
package ivy.learn
2+
3+
import kotlinx.serialization.SerialName
4+
import kotlinx.serialization.Serializable
5+
import kotlin.jvm.JvmInline
6+
7+
@Serializable
8+
data class Lesson(
9+
override val id: LessonId,
10+
val name: String,
11+
val tagline: String,
12+
val image: ImageUrl,
13+
val content: LessonContent,
14+
val completed: Boolean,
15+
) : Identifiable<LessonId>
16+
17+
@Serializable
18+
data class LessonContent(
19+
val rootItem: LessonItemId,
20+
val items: Map<LessonItemId, LessonItem>,
21+
)
22+
23+
@Serializable
24+
@JvmInline
25+
value class LessonId(override val value: String) : Id
26+
27+
@Serializable
28+
sealed interface LessonItem {
29+
val id: LessonItemId
30+
}
31+
32+
@Serializable
33+
@JvmInline
34+
value class LessonItemId(val value: String)
35+
36+
/**
37+
* Item that doesn't branch the tree.
38+
*/
39+
interface LinearItem {
40+
val next: LessonItemId?
41+
}
42+
43+
@Serializable
44+
@SerialName("TextItem")
45+
data class TextItem(
46+
override val id: LessonItemId,
47+
val text: String,
48+
val style: TextStyle,
49+
override val next: LessonItemId?,
50+
) : LessonItem, LinearItem
51+
52+
@Serializable
53+
enum class TextStyle {
54+
Heading,
55+
Body,
56+
BodySpacingMedium,
57+
BodySpacingLarge
58+
}
59+
60+
@Serializable
61+
@SerialName("QuestionItem")
62+
data class QuestionItem(
63+
override val id: LessonItemId,
64+
val question: String,
65+
val clarification: String?,
66+
val answers: List<Answer>,
67+
val correct: Set<AnswerId>,
68+
override val next: LessonItemId?,
69+
) : LessonItem, LinearItem
70+
71+
@Serializable
72+
data class Answer(
73+
val id: AnswerId,
74+
val text: String,
75+
val explanation: String?,
76+
)
77+
78+
@Serializable
79+
@JvmInline
80+
value class AnswerId(val value: String)
81+
82+
@Serializable
83+
@SerialName("OpenQuestionItem")
84+
data class OpenQuestionItem(
85+
override val id: LessonItemId,
86+
val question: String,
87+
val correctAnswer: String,
88+
override val next: LessonItemId?,
89+
) : LessonItem, LinearItem
90+
91+
@Serializable
92+
@SerialName("LinkItem")
93+
data class LinkItem(
94+
override val id: LessonItemId,
95+
val text: String,
96+
val url: String,
97+
override val next: LessonItemId?,
98+
) : LessonItem, LinearItem
99+
100+
@Serializable
101+
@SerialName("LessonNavigationItem")
102+
data class LessonNavigationItem(
103+
override val id: LessonItemId,
104+
val text: String,
105+
val onClick: LessonItemId,
106+
override val next: LessonItemId?,
107+
) : LessonItem, LinearItem
108+
109+
@Serializable
110+
@SerialName("LottieAnimationItem")
111+
data class LottieAnimationItem(
112+
override val id: LessonItemId,
113+
val lottie: LottieAnimation,
114+
override val next: LessonItemId?,
115+
) : LessonItem, LinearItem
116+
117+
@Serializable
118+
@JvmInline
119+
value class LottieAnimation(val url: String)
120+
121+
@Serializable
122+
@SerialName("ImageItem")
123+
data class ImageItem(
124+
override val id: LessonItemId,
125+
val image: ImageUrl,
126+
override val next: LessonItemId?,
127+
) : LessonItem, LinearItem
128+
129+
@Serializable
130+
@JvmInline
131+
value class ImageUrl(val url: String)
132+
133+
@Serializable
134+
@SerialName("ChoiceItem")
135+
data class ChoiceItem(
136+
override val id: LessonItemId,
137+
val question: String,
138+
val options: List<ChoiceOption>,
139+
) : LessonItem
140+
141+
@Serializable
142+
data class ChoiceOption(
143+
val id: ChoiceOptionId,
144+
val text: String,
145+
val next: LessonItemId,
146+
)
147+
148+
@Serializable
149+
@JvmInline
150+
value class ChoiceOptionId(val value: String)
151+
152+
@Serializable
153+
@SerialName("MysteryItem")
154+
data class MysteryItem(
155+
override val id: LessonItemId,
156+
val text: String,
157+
val hidden: LessonItemId,
158+
override val next: LessonItemId?
159+
) : LessonItem, LinearItem
160+
161+
@Serializable
162+
@SerialName("SoundItem")
163+
data class SoundItem(
164+
override val id: LessonItemId,
165+
val text: String,
166+
val sound: SoundUrl,
167+
override val next: LessonItemId?
168+
) : LessonItem, LinearItem
169+
170+
@Serializable
171+
@JvmInline
172+
value class SoundUrl(val url: String)
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package ivy.learn
2+
3+
import kotlinx.serialization.Serializable
4+
import kotlin.jvm.JvmInline
5+
6+
@Serializable
7+
data class Topic(
8+
override val id: TopicId,
9+
val name: String,
10+
val courses: List<CourseId>
11+
) : Identifiable<TopicId>
12+
13+
@JvmInline
14+
@Serializable
15+
value class TopicId(override val value: String) : Id

0 commit comments

Comments
 (0)