UNPKG

1.42 kBJavaScriptView Raw
1let {isArray} = require('underscore')
2let patterns = require('./patterns')
3let values = require('./values')
4
5/**
6 * Parse the solidity type and give relevant information such is dimensions
7 * @param {string} val
8 * @return {object}
9 */
10function parseType(val) {
11 let baseType = patterns.solidityTypeNoLength.exec(val)
12 let bitLength = patterns.typeN.exec(val)
13 let dimensions = val.match(patterns.solidityDimensions)
14 let hasDimensions
15 let hasDynamicDimensions
16
17 if (baseType !== null) {
18 baseType = baseType[1]
19 }
20
21 if (bitLength !== null) {
22 bitLength = parseInt(bitLength[1], 10)
23 }
24
25 // bytes and string are dynamic
26
27 if (dimensions !== null) {
28 dimensions = dimensions.map(item => {
29 let op = {}
30 let digit = item.match(patterns.solidityDimensionDigit)
31
32 // having [] is dynamic
33 op.dynamic = item === values.solidity.dimensionsDynamic
34
35 // otherwise the user specified a fixed length
36 if (digit !== null) {
37 op.length = parseInt(digit[0], 10)
38 }
39
40 return op
41 })
42 }
43
44 // has [] or [6] or [][2]
45 hasDimensions = isArray(dimensions) === true
46
47 // has [] or [][]
48 hasDynamicDimensions =
49 hasDimensions === true &&
50 isArray(dimensions) === true &&
51 dimensions.some(item => item.dynamic === true)
52
53 return {
54 baseType,
55 bitLength,
56 dimensions,
57 hasDimensions,
58 hasDynamicDimensions
59 }
60}
61
62module.exports = {
63 parseType
64}