Skip to content

Commit

Permalink
manifest: add Info method
Browse files Browse the repository at this point in the history
  • Loading branch information
colindickson committed Sep 20, 2023
1 parent a21236e commit 850c994
Show file tree
Hide file tree
Showing 3 changed files with 165 additions and 0 deletions.
137 changes: 137 additions & 0 deletions manifest/info.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,137 @@
package manifest

import (
"fmt"
"strings"

pbsubstreams "github.com/streamingfast/substreams/pb/sf/substreams/v1"
"google.golang.org/protobuf/types/descriptorpb"
)

type ManifestInfo struct {
Name string `json:"name"`
Version string `json:"version"`
Modules []ModulesInfo `json:"modules"`
ProtoFiles []*ProtoFileInfo `json:"proto_files"`
}

type ProtoFileInfo struct {
Name *string `json:"name,omitempty"`
Package *string `json:"package,omitempty"`
Dependencies []string `json:"dependencies,omitempty"`
PublicDependencies []int32 `json:"public_dependencies,omitempty"`
MessageType []*descriptorpb.DescriptorProto `json:"message_type,omitempty"`
Services []*descriptorpb.ServiceDescriptorProto `json:"services,omitempty"`
}

type ModulesInfo struct {
Name string `json:"name"`
Kind string `json:"kind"`
Inputs []ModuleInput `json:"inputs"`
OutputType string `json:"output_type"`
UpdatePolicy *string `json:"update_policy,omitempty"`
InitialBlock uint64 `json:"initial_block"`
Documentation string `json:"documentation"`
Hash string `json:"hash"`
}

type ModuleInput struct {
Type string `json:"type"`
Name string `json:"name"`
Mode *string `json:"mode,omitempty"` //for store inputs
}

func Info(manifestPath string) (*ManifestInfo, error) {
reader, err := NewReader(manifestPath)
if err != nil {
return nil, fmt.Errorf("manifest reader: %w", err)
}

pkg, err := reader.Read()
if err != nil {
return nil, fmt.Errorf("read manifest %q: %w", manifestPath, err)
}

graph, err := NewModuleGraph(pkg.Modules.Modules)
if err != nil {
return nil, fmt.Errorf("creating module graph: %w", err)
}

modules := make([]ModulesInfo, 0, len(pkg.Modules.Modules))

hashes := NewModuleHashes()
for ix, mod := range pkg.Modules.Modules {
modInfo := ModulesInfo{}

_, _ = hashes.HashModule(pkg.Modules, mod, graph)
modInfo.Hash = hashes.Get(mod.Name)

modInfo.Name = mod.Name
modInfo.InitialBlock = mod.InitialBlock

kind := mod.GetKind()
switch v := kind.(type) {
case *pbsubstreams.Module_KindMap_:
modInfo.Kind = "map"
modInfo.OutputType = v.KindMap.OutputType
case *pbsubstreams.Module_KindStore_:
modInfo.Kind = "store"
modInfo.OutputType = v.KindStore.ValueType
modInfo.UpdatePolicy = strPtr(v.KindStore.UpdatePolicy.Pretty())
default:
modInfo.Kind = "unknown"
}

modMeta := pkg.ModuleMeta[ix]
if modMeta != nil && modMeta.Doc != "" {
modInfo.Documentation = strings.Replace(modMeta.Doc, "\n", "\n ", -1)
}

inputs := make([]ModuleInput, 0, len(mod.Inputs))
for _, input := range mod.Inputs {
inputInfo := ModuleInput{}

switch v := input.Input.(type) {
case *pbsubstreams.Module_Input_Source_:
inputInfo.Type = "source"
inputInfo.Name = v.Source.Type
case *pbsubstreams.Module_Input_Map_:
inputInfo.Type = "map"
inputInfo.Name = v.Map.ModuleName
case *pbsubstreams.Module_Input_Store_:
inputInfo.Type = "store"
inputInfo.Name = v.Store.ModuleName
if v.Store.Mode > 0 {
inputInfo.Mode = strPtr(v.Store.Mode.Pretty())
}
}

inputs = append(inputs, inputInfo)
}
modInfo.Inputs = inputs

modules = append(modules, modInfo)
}

protoFiles := make([]*ProtoFileInfo, 0, len(pkg.ProtoFiles))
for _, protoFile := range pkg.ProtoFiles {
protoFiles = append(protoFiles, &ProtoFileInfo{
Name: protoFile.Name,
Package: protoFile.Package,
Dependencies: protoFile.Dependency,
PublicDependencies: protoFile.PublicDependency,
MessageType: protoFile.MessageType,
})
}

return &ManifestInfo{
Name: pkg.PackageMeta[0].Name,
Version: pkg.PackageMeta[0].Version,
Modules: modules,
ProtoFiles: protoFiles,
}, nil
}

func strPtr(s string) *string {
return &s
}
20 changes: 20 additions & 0 deletions manifest/info_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package manifest

import (
"encoding/json"
"fmt"
"github.com/stretchr/testify/require"
"testing"
)

func TestInfo(t *testing.T) {
info, err := Info("https://github.com/streamingfast/substreams-uniswap-v3/releases/download/v0.2.8/substreams.spkg")
if err != nil {
t.Fatal(err)
}

r, err := json.MarshalIndent(info, "", " ")
require.NoError(t, err)

fmt.Println(string(r))
}
8 changes: 8 additions & 0 deletions pb/sf/substreams/v1/modules.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,3 +36,11 @@ func (x *Module_Input) Pretty() string {

return strings.TrimSpace(result)
}

func (x Module_KindStore_UpdatePolicy) Pretty() string {
return strings.TrimPrefix(strings.ToLower(x.String()), "update_policy_")
}

func (x Module_Input_Store_Mode) Pretty() string {
return strings.ToLower(Module_Input_Store_Mode_name[int32(x)])
}

0 comments on commit 850c994

Please sign in to comment.