Skip to content

Commit

Permalink
generate chains
Browse files Browse the repository at this point in the history
  • Loading branch information
dimkouv committed Jan 23, 2024
1 parent b41a0ba commit 4dde7cc
Show file tree
Hide file tree
Showing 5 changed files with 263 additions and 1 deletion.
8 changes: 7 additions & 1 deletion .github/workflows/go.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,4 +17,10 @@ jobs:
- name: Build
run: go build -v ./...
- name: Test
run: go test -v ./...
run: go test -v ./...
- name: Make sure generated files are updated
run: |
if go generate | grep -q 'no changes detected'; then
exit 0;
fi
exit 1;
113 changes: 113 additions & 0 deletions genchains.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
//go:build ignore

package main

import (
"bytes"
"fmt"
"go/format"
"html/template"
"os"
"sort"
"strconv"
"strings"
"unicode"

chain_selectors "github.com/smartcontractkit/chain-selectors"
)

const filename = "generated_chains.go"

type chain struct {
EvmChainID uint64
Selector uint64
Name string
VarName string
}

var chainTemplate, _ = template.New("").Parse(`// Code generated by go generate please DO NOT EDIT
package chain_selectors
type Chain struct {
EvmChainID uint64
Selector uint64
Name string
VarName string
}
var (
{{ range . }}
{{.VarName}} = Chain{EvmChainID: {{ .EvmChainID }}, Selector: {{ .Selector }}, Name: "{{ .Name }}"}{{ end }}
)
var ALL = []Chain{
{{ range . }}{{ .VarName }},
{{ end }}
}
`)

func main() {
src, err := genChainsSourceCode()
if err != nil {
panic(err)
}

formatted, err := format.Source([]byte(src))
if err != nil {
panic(err)
}

existingContent, err := os.ReadFile(filename)
if err != nil {
panic(err)
}

if string(existingContent) == string(formatted) {
fmt.Println("no changes detected")
return
}

err = os.WriteFile(filename, formatted, 0644)
if err != nil {
panic(err)
}
}

func genChainsSourceCode() (string, error) {
var wr = new(bytes.Buffer)
chains := make([]chain, 0)

for evmChainID, chainSel := range chain_selectors.EvmChainIdToChainSelector() {
name, err := chain_selectors.NameFromChainId(evmChainID)
if err != nil {
return "", err
}

chains = append(chains, chain{
EvmChainID: evmChainID,
Selector: chainSel,
Name: name,
VarName: toVarName(name, chainSel),
})
}

sort.Slice(chains, func(i, j int) bool { return chains[i].VarName < chains[j].VarName })
if err := chainTemplate.ExecuteTemplate(wr, "", chains); err != nil {
return "", err
}
return wr.String(), nil
}

func toVarName(name string, chainSel uint64) string {
const unnamed = "UNNAMED"
x := strings.ReplaceAll(name, "-", "_")
x = strings.ToUpper(x)
if len(x) > 0 && unicode.IsDigit(rune(x[0])) {
x = unnamed + "_" + x
}
if len(x) == 0 {
x = unnamed + "_" + strconv.FormatUint(chainSel, 10)
}
return x
}
129 changes: 129 additions & 0 deletions generated_chains.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions selectors.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ import (
"gopkg.in/yaml.v3"
)

//go:generate go run genchains.go

//go:embed selectors.yml
var selectorsYml []byte

Expand Down
12 changes: 12 additions & 0 deletions selectors_e2e_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package chain_selectors_test

import (
"testing"

chain_selectors "github.com/smartcontractkit/chain-selectors"
"github.com/stretchr/testify/assert"
)

func TestAccessGeneratedChain(t *testing.T) {
assert.Equal(t, uint64(43114), chain_selectors.AVALANCHE_MAINNET.EvmChainID)
}

0 comments on commit 4dde7cc

Please sign in to comment.