Skip to content

Commit 965e401

Browse files
authored
Merge pull request #17 from lazyledger/adlerjohn-feature_flags
Add new feature flags
2 parents d68fdfc + effa93e commit 965e401

File tree

2 files changed

+94
-1
lines changed

2 files changed

+94
-1
lines changed

README.md

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,10 @@ Serialization rules are stricter than default protobuf3 rules, and are specified
1313

1414
Use as a `protoc` plugin:
1515
```sh
16-
protoc --plugin protoc-gen-sol --sol_out [license=<license string>:]<output directory> <proto files>
16+
protoc \
17+
--plugin protoc-gen-sol \
18+
--sol_out [license=<license string>,compile=<link,inline>,generate=<all,decoder,encoder>:]<output directory> \
19+
<proto files>
1720
```
1821

1922
Examples:
@@ -25,6 +28,18 @@ protoc --plugin protoc-gen-sol --sol_out . foo.proto
2528
protoc --plugin protoc-gen-sol --sol_out license=Apache-2.0:. foo.proto
2629
```
2730

31+
### Parameters
32+
33+
- `license`: default `CC0`
34+
- any string is accepted, and the generated license comment will use the string as-is
35+
- `compile`: default `inline`
36+
- `inline`: the generated library's functions will be inlined (`JUMP`)
37+
- `link`: the generated library's functions will be linked (`DELEGATECALL`)
38+
- `generate`: default `all`
39+
- `all`: both decoder and encoder will be generated
40+
- `decoder`: only decoder will be generated
41+
- `encoder`: only encoder will be generated
42+
2843
### Feature support
2944

3045
The below protobuf file shows all supported features of this plugin.

generator/generator.go

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,62 @@ const SolidityVersionString = ">=0.6.0 <8.0.0"
1717
// SolidityABIString indicates ABIEncoderV2 use.
1818
const SolidityABIString = "pragma experimental ABIEncoderV2;"
1919

20+
type compileFlag string
21+
22+
const (
23+
compileFlagLink compileFlag = "link"
24+
compileFlagCompile compileFlag = "compile"
25+
)
26+
27+
func fromCompileFlag(f compileFlag) string {
28+
return string(f)
29+
}
30+
31+
func toCompileFlag(s string) (compileFlag, error) {
32+
switch s {
33+
case fromCompileFlag(compileFlagLink):
34+
return compileFlagLink, nil
35+
case fromCompileFlag(compileFlagCompile):
36+
return compileFlagCompile, nil
37+
}
38+
39+
return compileFlagCompile, fmt.Errorf("unknown compile flag %s, allowed values are <link, compile>", s)
40+
}
41+
42+
type generateFlag string
43+
44+
const (
45+
generateFlagAll generateFlag = "all"
46+
generateFlagDecoder generateFlag = "decoder"
47+
generateFlagEncoder generateFlag = "encoder"
48+
)
49+
50+
func fromGenerateFlag(f generateFlag) string {
51+
return string(f)
52+
}
53+
54+
func toGenerateFlag(s string) (generateFlag, error) {
55+
switch s {
56+
case fromGenerateFlag(generateFlagAll):
57+
return generateFlagAll, nil
58+
case fromGenerateFlag(generateFlagDecoder):
59+
return generateFlagDecoder, nil
60+
case fromGenerateFlag(generateFlagEncoder):
61+
return generateFlagEncoder, nil
62+
}
63+
64+
return generateFlagAll, fmt.Errorf("unknown generate flag %s, allowed values are <all, decoder, encoder>", s)
65+
}
66+
2067
// Generator generates Solidity code from .proto files.
2168
type Generator struct {
2269
request *pluginpb.CodeGeneratorRequest
2370
enumMaxes map[string]int
2471

2572
versionString string
2673
licenseString string
74+
compileFlag compileFlag
75+
generateFlag generateFlag
2776
}
2877

2978
// New initializes a new Generator.
@@ -36,6 +85,9 @@ func New(request *pluginpb.CodeGeneratorRequest, versionString string) *Generato
3685
g.versionString = versionString
3786
g.licenseString = "CC0"
3887

88+
g.compileFlag = compileFlagCompile
89+
g.generateFlag = generateFlagAll
90+
3991
return g
4092
}
4193

@@ -53,6 +105,32 @@ func (g *Generator) ParseParameters() error {
53105
switch key {
54106
case "license":
55107
g.licenseString = value
108+
case "compile":
109+
flag, err := toCompileFlag(value)
110+
if err != nil {
111+
return err
112+
}
113+
g.compileFlag = flag
114+
115+
// TODO implement these
116+
switch flag {
117+
case compileFlagLink:
118+
return fmt.Errorf("unimplemented feature %s", flag)
119+
}
120+
case "generate":
121+
flag, err := toGenerateFlag(value)
122+
if err != nil {
123+
return err
124+
}
125+
g.generateFlag = flag
126+
127+
// TODO implement these
128+
switch flag {
129+
case
130+
generateFlagDecoder,
131+
generateFlagEncoder:
132+
return fmt.Errorf("unimplemented feature %s", flag)
133+
}
56134
default:
57135
return errors.New("unrecognized option " + key)
58136
}

0 commit comments

Comments
 (0)