Files: 5418f16a7749446c341174100524c5ddcec4a6a9 / utils.js
1749 bytesRaw
1 | const { ID, FunctionRef, ModuleRef, generateActorId, getType } = require('./') |
2 | |
3 | const actorRefToId = ref => ref.reduce((parent, curr) => generateActorId({ parent, nonce: curr }), null) |
4 | |
5 | const toHex = arg => Buffer.isBuffer(arg) ? `0x${arg.toString('hex')}` : arg |
6 | |
7 | const fromHex = arg => typeof arg !== 'string' ? arg : Buffer.from(arg.slice(0, 2) === '0x' ? arg.slice(2) : arg, 'hex') |
8 | |
9 | const toJSON = arg => { |
10 | switch (getType(arg)) { |
11 | case 'elem': |
12 | return arg.map(toJSON) |
13 | case 'id': |
14 | return toJSON(arg.id) |
15 | case 'func': |
16 | return { |
17 | '@FunctionRef': { |
18 | id: toJSON(arg.actorID), |
19 | private: arg.identifier[0], |
20 | name: arg.identifier[1], |
21 | gas: arg.gas |
22 | } |
23 | } |
24 | case 'mod': |
25 | return { |
26 | '@ModuleRef': { |
27 | id: toJSON(arg.id) |
28 | } |
29 | } |
30 | case 'link': |
31 | return { |
32 | '@Link': { |
33 | '/': toJSON(arg['/']) |
34 | } |
35 | } |
36 | case 'data': |
37 | default: |
38 | return toHex(arg) |
39 | } |
40 | } |
41 | |
42 | const fromJSON = arg => { |
43 | if (typeof arg === 'object') { |
44 | if (Array.isArray(arg)) { |
45 | return arg.map(fromJSON) |
46 | } |
47 | |
48 | if (arg['@FunctionRef']) { |
49 | const data = arg['@FunctionRef'] |
50 | return new FunctionRef({ |
51 | identifier: [data.private, data.name], |
52 | actorID: new ID(fromJSON(data.id)), |
53 | params: data.params, |
54 | gas: data.gas |
55 | }) |
56 | } else if (arg['@ModuleRef']) { |
57 | const data = arg['@ModuleRef'] |
58 | return new ModuleRef(data.exports, new ID(fromJSON(data.id))) |
59 | } else if (arg['@Link']) { |
60 | const data = arg['@Link'] |
61 | return { |
62 | '/': fromJSON(data['/']) |
63 | } |
64 | } |
65 | } |
66 | |
67 | return fromHex(arg) |
68 | } |
69 | |
70 | module.exports = { |
71 | actorRefToId, |
72 | toJSON, |
73 | fromJSON, |
74 | toHex, |
75 | fromHex |
76 | } |
77 |
Built with git-ssb-web