-
Notifications
You must be signed in to change notification settings - Fork 22
/
Copy pathindex.js
73 lines (64 loc) · 1.41 KB
/
index.js
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
var protobuf = require('protocol-buffers-schema')
var mappings = {
'array': 'repeated',
'object': 'message',
'integer': 'int32',
'number': 'int32',
'string': 'string',
'boolean': 'bool'
}
module.exports = function (schema) {
if (typeof schema === 'string') schema = JSON.parse(schema)
var result = {
syntax: 2,
package: null,
enums: [],
messages: []
}
if (schema.type === 'object') {
result.messages.push(Message(schema))
}
return protobuf.stringify(result)
}
function Message (schema) {
var message = {
name: schema.name,
enums: [],
messages: [],
fields: []
}
var tag = 1
for (var key in schema.properties) {
var field = schema.properties[key]
if (field.type === 'object') {
field.name = key
message.messages.push(Message(field))
} else {
field.name = key
message.fields.push(Field(field, tag))
tag += 1
}
}
for (var i in schema.required) {
var required = schema.required[i]
for (var i in message.fields) {
var field = message.fields[i]
if (required === field.name) field.required = true
}
}
return message
}
function Field (field, tag) {
var type = mappings[field.type] || field.type
var repeated = false
if (field.type === 'array') {
repeated = true
type = field.items.type
}
return {
name: field.name,
type: type,
tag: tag,
repeated: repeated
}
}