-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathparse_config.nim
237 lines (202 loc) · 5.54 KB
/
parse_config.nim
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
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
import os, streams
import json, parseXml
import types
proc parseConfigXml(filename: string): Analysis
proc parseConfigJson(filename: string): Analysis
proc parseConfigYaml(filename: string)
let filename = "test.xml"
var s = newFileStream(filename, fmRead)
if s == nil: quit("cannot open the file " & filename)
proc parseAction(xd: var XmlParser): Way =
var
name: string
description: string
query: string
# name
xd.next
if xd.attrkey == "name":
name = xd.attrValue
# description
xd.next
if xd.attrkey == "description":
description = xd.attrValue
# >
xd.next
# query
xd.next
# data
if xd.elementName == "query":
xd.next
query = xd.charData
# query end
xd.next
# action end
xd.next
# next action
xd.next
result = initWay(name=name, description=description, query=query)
proc parseSchema(xd: var XmlParser): Schema =
# data
xd.next
result = xd.charData
# schema end
xd.next
# next schema
xd.next
proc parseTable(xd: var XmlParser): Table =
var
count: string
name: string
description: string
query: string
xd.next
if xd.attrKey == "count":
count = xd.attrValue
xd.next
if xd.attrKey == "name":
name = xd.attrValue
xd.next
if xd.attrKey == "description":
description = xd.attrValue
xd.next
xd.next
if xd.kind == xmlElementStart and xd.elementName == "query":
xd.next
query = xd.charData
# query end
xd.next
# table end
xd.next
xd.next
return initTable(count, name, description, query)
proc parseIndex(xd: var XmlParser): Index =
# data
xd.next
result = xd.charData
# index end
xd.next
# next index
xd.next
proc parseConfigureFile(filename: string): Analysis =
let (_, _, ext) = splitFile(filename)
case ext:
of ".xml":
result = parseConfigXml(filename)
of ".json":
result = parseConfigJson(filename)
of ".yaml":
parseConfigYaml(filename)
proc parseConfigXml(filename: string): Analysis =
var
xmlNode: XmlParser
analysis = new Analysis
open(xmlNode, s, filename)
while true:
case xmlNode.kind
of xmlElementStart:
case xmlNode.elementName:
of "rootDir":
# get rootDir no attr
xmlNode.next
analysis.rootDir = xmlNode.charData
of "quality":
# get quality no attr
xmlNode.next
analysis.quality = xmlNode.charData
of "schemas":
var schema: seq[string] = @[]
# schema
xmlNode.next
while xmlNode.elementName == "schema":
schema.add(xmlNode.parseSchema)
analysis.schemas = schema
of "indexes":
var idx: seq[string] = @[]
# index
xmlNode.next
while xmlNode.elementName == "index":
idx.add(xmlNode.parseIndex)
analysis.indexes = idx
xmlNode.next
of xmlElementOpen:
while xmlNode.elementName == "table":
analysis.tables = parseTable(xmlNode)
if xmlNode.elementName == "actions":
var
name: string
actionSeq: seq[Way]
# actions attr
xmlNode.next
name = xmlNode.attrValue
# >
xmlNode.next
# action <
xmlNode.next
while xmlNode.elementName == "action":
actionSeq.add(xmlNode.parseAction)
analysis.actions = initAction(name=name, actions=actionSeq)
xmlNode.next
of xmlElementEnd:
xmlNode.next
of xmlPI:
xmlNode.next
of xmlEOf:
break
of xmlError:
echo xmlNode.errorMsg
xmlNode.next
else:
xmlNode.next
result = analysis
proc parseConfigJson(filename: string): Analysis =
let s = open(filename, fmRead)
let jsonNode = parseJson(s.readAll)
let node = jsonNode["analysis"]
let rootDir = node["rootDir"]
let quality = node["quality"]
let schemas = node["schemas"]["schema"]
let table = node["tables"]["table"]
let index = node["indexes"]["index"]
let actions = node["actions"]
let name = actions["@name"]
let action = actions["action"]
var analysis = new Analysis
var
schema: seq[Schema] = @[]
idx: seq[Index] = @[]
analysis.rootDir = rootDir.getStr
analysis.quality = quality.getStr
for s in index.getElems:
idx.add(s.getStr)
# 待修复
if idx.len != 0:
analysis.indexes = idx
else:
analysis.indexes = @[index.getStr]
for s in schemas.getElems:
schema.add(s.getStr)
analysis.schemas = schema
analysis.tables = initTable(table["@count"].getStr,
table["@name"].getStr,
table["@description"].getStr,
table["query"].getStr)
var way_seq: seq[Way] = @[]
for w in action.getElems:
way_seq.add(initWay(w["@name"].getStr,
w["@description"].getStr, w["query"].getStr))
analysis.actions = initAction(name.getStr, way_seq)
s.close()
return analysis
proc parseConfigYaml(filename: string) =
discard
when isMainModule:
# define analysis
let a1 = parseConfigXml(filename="test.xml")
let a2 = parseConfigJson(filename="test.json")
echo a1.rootDir == a2.rootDir
echo a1.quality == a2.quality
echo a1.schemas == a2.schemas
# echo "a1: ", a1.schemas, "\na2: ", a2.schemas
echo "a1: ", a1.actions
echo "a2: ", a2.actions
echo "a1: ", a1.tables, "\na2: ", a2.tables