aboutsummaryrefslogtreecommitdiffstats
path: root/app/src/main/java/net/lacolaco/smileessence/data/Pages.kt
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()
        }
    }
}