-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtalk.kt
More file actions
executable file
·126 lines (110 loc) · 3.31 KB
/
talk.kt
File metadata and controls
executable file
·126 lines (110 loc) · 3.31 KB
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
124
125
126
#!/usr/bin/env kscript
import kotlin.system.exitProcess
//////////////////////////////////////////////////////////////////////////////////////////////////////////
// Helper methods
//////////////////////////////////////////////////////////////////////////////////////////////////////////
fun status(status: String) = println("status: $status")
fun error(message: String) = println("error: $message")
fun call(method: String) = println("call: $method")
fun input(prompt: String = "command"): String? {
println("?$prompt")
return readLine()
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////
// Impl.
//////////////////////////////////////////////////////////////////////////////////////////////////////////
var possible: Array<String>? = null
fun complete(data: String) {
if (possible == null) {
error("no index")
return
}
val outputs = (possible as Array<String>).filter { it.startsWith(data) }
val outputString = outputs.map { "\"$it\"" }.joinToString()
println("""
{
"string":"$data",
"completion": [
$outputString
]
}
""".trimIndent())
}
fun describe(type: String, identifier: String) {
if (possible == null) {
error("no index")
return
}
var name = identifier
if (type == "func") name += "()"
if ((possible as Array<String>).filter { it == name }.size < 1) {
error("not found")
return
}
println("""
{
"name":"${name.removeSuffix("()")}",
"description":""
"type":"${if (type == "func") "function" else "property"}"
"args":[
]
}
""".trimIndent())
}
fun index(directory: String) {
status("indexing")
possible = arrayOf(
"actionBar",
"actions",
"activity",
"archive",
"buildArchive()",
"connect()",
"disconnect()",
"cleanup()",
"connection_id",
"cache",
"dumpCache()",
"forceRestartConnection()",
"killAll()",
"microCodeVersion",
"malloc()",
"GroupInfo",
"groupInfo",
"groupInfo.blocks",
"groupInfo.test",
"groupInfo.test.sub",
"groupInfo.ammount",
"groupInfo.nBlocks",
"sizeOf()"
)
status("ready")
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////
// Main loop
//////////////////////////////////////////////////////////////////////////////////////////////////////////
val VER = 1
println("---------------- Starting Communication ----------------")
println("version: $VER")
if (input("verify") != "ok") {
error("version mismatch")
exitProcess(1)
}
status("connected")
listen@ while (true) {
// Process the input to parse commands
var ln = input() ?: ""
if (ln.split(":").size < 2) ln += ";"
val command = ln.split(";")[0].split(",")[0].trim()
val modifiers = ln.removePrefix(command).removePrefix(",").trim().split(";")[0].split(",").map { it.trim() }
val data = ln.split(";")[1].trim()
//println("Input: command=$command, modifiers=$modifiers, data=$data")
when (command) {
"index" -> index(data)
"complete" -> complete(data)
"describe" -> describe(type = modifiers[0], identifier = data)
"done" -> break@listen
else -> error("invalid")
}
}
status("done")