Skip to content

Commit 2c2b4e6

Browse files
committed
codegen: Move DataSourceTemplate logic to protocols folder
1 parent edd3a5f commit 2c2b4e6

File tree

5 files changed

+110
-52
lines changed

5 files changed

+110
-52
lines changed

src/codegen/template.js

Lines changed: 9 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,19 @@ const immutable = require('immutable')
33
const tsCodegen = require('./typescript')
44

55
module.exports = class DataSourceTemplateCodeGenerator {
6-
constructor(template) {
6+
constructor(template, protocol) {
77
this.template = template
8+
this.protocolTemplateCodeGen = protocol.getTemplateCodeGen(template)
89
}
910

1011
generateModuleImports() {
1112
return [
1213
tsCodegen.moduleImports(
13-
['Address', 'DataSourceTemplate', 'DataSourceContext'],
14+
[
15+
...this.protocolTemplateCodeGen.generateModuleImports(),
16+
'DataSourceTemplate',
17+
'DataSourceContext',
18+
],
1419
'@graphprotocol/graph-ts',
1520
),
1621
]
@@ -24,55 +29,8 @@ module.exports = class DataSourceTemplateCodeGenerator {
2429
let name = this.template.get('name')
2530

2631
let klass = tsCodegen.klass(name, { export: true, extends: 'DataSourceTemplate' })
27-
klass.addMethod(this._generateCreateMethod())
28-
klass.addMethod(this._generateCreateWithContextMethod())
32+
klass.addMethod(this.protocolTemplateCodeGen.generateCreateMethod())
33+
klass.addMethod(this.protocolTemplateCodeGen.generateCreateWithContextMethod())
2934
return klass
3035
}
31-
32-
_generateCreateMethod() {
33-
let name = this.template.get('name')
34-
let kind = this.template.get('kind')
35-
36-
switch (kind) {
37-
case 'ethereum/contract':
38-
return tsCodegen.staticMethod(
39-
'create',
40-
[tsCodegen.param('address', tsCodegen.namedType('Address'))],
41-
tsCodegen.namedType('void'),
42-
`
43-
DataSourceTemplate.create('${name}', [address.toHex()])
44-
`,
45-
)
46-
47-
default:
48-
throw new Error(
49-
`Data sources with kind != 'ethereum/contract' are not supported yet`,
50-
)
51-
}
52-
}
53-
54-
_generateCreateWithContextMethod() {
55-
let name = this.template.get('name')
56-
let kind = this.template.get('kind')
57-
58-
switch (kind) {
59-
case 'ethereum/contract':
60-
return tsCodegen.staticMethod(
61-
'createWithContext',
62-
[
63-
tsCodegen.param('address', tsCodegen.namedType('Address')),
64-
tsCodegen.param('context', tsCodegen.namedType('DataSourceContext')),
65-
],
66-
tsCodegen.namedType('void'),
67-
`
68-
DataSourceTemplate.createWithContext('${name}', [address.toHex()], context)
69-
`,
70-
)
71-
72-
default:
73-
throw new Error(
74-
`Data sources with kind != 'ethereum/contract' are not supported yet`,
75-
)
76-
}
77-
}
7836
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
const tsCodegen = require('../../../codegen/typescript')
2+
3+
module.exports = class EthereumTemplateCodeGen {
4+
constructor(template) {
5+
this.template = template
6+
}
7+
8+
generateModuleImports() {
9+
return [
10+
'Address',
11+
]
12+
}
13+
14+
generateCreateMethod() {
15+
const name = this.template.get('name')
16+
17+
return tsCodegen.staticMethod(
18+
'create',
19+
[tsCodegen.param('address', tsCodegen.namedType('Address'))],
20+
tsCodegen.namedType('void'),
21+
`
22+
DataSourceTemplate.create('${name}', [address.toHex()])
23+
`,
24+
)
25+
}
26+
27+
generateCreateWithContextMethod() {
28+
const name = this.template.get('name')
29+
30+
return tsCodegen.staticMethod(
31+
'createWithContext',
32+
[
33+
tsCodegen.param('address', tsCodegen.namedType('Address')),
34+
tsCodegen.param('context', tsCodegen.namedType('DataSourceContext')),
35+
],
36+
tsCodegen.namedType('void'),
37+
`
38+
DataSourceTemplate.createWithContext('${name}', [address.toHex()], context)
39+
`,
40+
)
41+
}
42+
}

src/protocols/index.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
const EthereumTypeGenerator = require('./ethereum/type-generator')
2+
const EthereumTemplateCodeGen = require('./ethereum/codegen/template')
3+
const NearTemplateCodeGen = require('./near/codegen/template')
24

35
module.exports = class Protocol {
46
static fromDataSources(dataSourcesAndTemplates) {
@@ -29,4 +31,18 @@ module.exports = class Protocol {
2931
return null
3032
}
3133
}
34+
35+
getTemplateCodeGen(template) {
36+
switch (this.name) {
37+
case 'ethereum':
38+
case 'ethereum/contract':
39+
return new EthereumTemplateCodeGen(template)
40+
case 'near':
41+
return new NearTemplateCodeGen(template)
42+
default:
43+
throw new Error(
44+
`Data sources with kind '${this.name}' are not supported yet`,
45+
)
46+
}
47+
}
3248
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
const tsCodegen = require('../../../codegen/typescript')
2+
3+
module.exports = class NearTemplateCodeGen {
4+
constructor(template) {
5+
this.template = template
6+
}
7+
8+
generateModuleImports() {
9+
return [
10+
'near',
11+
]
12+
}
13+
14+
generateCreateMethod() {
15+
const name = this.template.get('name')
16+
17+
return tsCodegen.staticMethod(
18+
'create',
19+
[tsCodegen.param('accountId', tsCodegen.namedType('near.AccountId'))],
20+
tsCodegen.namedType('void'),
21+
`
22+
DataSourceTemplate.create('${name}', [accountId])
23+
`,
24+
)
25+
}
26+
27+
generateCreateWithContextMethod() {
28+
const name = this.template.get('name')
29+
30+
return tsCodegen.staticMethod(
31+
'createWithContext',
32+
[
33+
tsCodegen.param('accountId', tsCodegen.namedType('near.AccountId')),
34+
tsCodegen.param('context', tsCodegen.namedType('DataSourceContext')),
35+
],
36+
tsCodegen.namedType('void'),
37+
`
38+
DataSourceTemplate.createWithContext('${name}', [accountId], context)
39+
`,
40+
)
41+
}
42+
}

src/type-generator.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ module.exports = class TypeGenerator {
156156
`${template.get('name')}`,
157157
)
158158

159-
let codeGenerator = new DataSourceTemplateCodeGenerator(template)
159+
let codeGenerator = new DataSourceTemplateCodeGenerator(template, this.protocol)
160160

161161
// Only generate module imports once, because they are identical for
162162
// all types generated for data source templates.

0 commit comments

Comments
 (0)