blob: cc3c1ab163d0e929c6065ab53892eab387b54037 (
plain)
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
|
package net.lacolaco.smileessence.data
import com.beust.klaxon.*
import net.lacolaco.smileessence.Logger
import net.lacolaco.smileessence.view.page.*
sealed class PageInfo(val fragmentClass: Class<out PageFragment<*>>) {
abstract val name: String
abstract fun describe(): String
abstract fun toJson(): JsonObject
class ComposePageInfo() : PageInfo(ComposePageFragment::class.java) {
override val name = "Compose"
override fun describe(): String {
return ""
}
constructor(json: JsonObject) : this()
override fun toJson() = json {
obj()
}
}
class TweetsPageInfo(override val name: String, val patternStrings: List<String>) :
PageInfo(TweetsPageFragment::class.java) {
val patterns = patternStrings.map { Regex(it) }
override fun describe(): String {
val sb = StringBuilder("Applied filters:")
patternStrings.forEach { sb.append("\n\t").append(it) }
return sb.toString()
}
constructor(json: JsonObject) : this(json.string("name")!!, json.array<String>("patterns")!!.toList())
override fun toJson() = json {
obj("name" to name, "patterns" to array(patternStrings))
}
}
class EventsPageInfo() : PageInfo(EventsPageFragment::class.java) {
override val name = "Events"
override fun describe(): String {
return ""
}
constructor(json: JsonObject) : this()
override fun toJson() = json {
obj()
}
}
class SearchPageInfo(var query: String) : PageInfo(SearchPageFragment::class.java) {
override val name
get() = "Search"
override fun describe(): String {
return "Search query:\n\t$query"
}
constructor(json: JsonObject) : this(json.string("query")!!)
override fun toJson() = json {
obj("query" to query)
}
}
class ListPageInfo(var fullName: String?) : PageInfo(ListPageFragment::class.java) {
override val name
get() = "List (${fullName ?: "<not selected>"})"
override fun describe(): String {
return ""
}
constructor(json: JsonObject) : this(json.string("full_name"))
override fun toJson() = json {
obj("full_name" to fullName)
}
}
// XXX: Yucks
companion object {
fun parseList(input: String): List<PageInfo> {
Logger.error("parsing: $input")
val parser = Parser()
val json = parser.parse(StringBuilder(input)) as JsonArray<*>
return json.map {
val data: JsonObject = (it as JsonObject).obj("data")!!
when (it.string("kind")) {
"compose" -> ComposePageInfo(data)
"tweets" -> TweetsPageInfo(data)
"events" -> EventsPageInfo(data)
"search" -> SearchPageInfo(data)
"list" -> ListPageInfo(data)
// FIXME: Remove this
"messages" -> null
else -> throw RuntimeException("invalid kind")
}
}.mapNotNull { it } // FIXME
}
fun stringifyList(input: List<PageInfo>): String {
return json {
array(input.map {
val kind = when (it) {
is ComposePageInfo -> "compose"
is TweetsPageInfo -> "tweets"
is EventsPageInfo -> "events"
is SearchPageInfo -> "search"
is ListPageInfo -> "list"
}
obj("kind" to kind, "data" to it.toJson())
})
}.toJsonString()
}
}
}
|