Skip to content

Commit

Permalink
Add register
Browse files Browse the repository at this point in the history
  • Loading branch information
Villaquiranm committed Apr 9, 2024
1 parent f12da74 commit a59e9a2
Show file tree
Hide file tree
Showing 7 changed files with 131 additions and 50 deletions.
66 changes: 66 additions & 0 deletions examples/gno.land/r/demo/teritori/providers/profiles.gno
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
package provider

import (
"std"
"gno.land/p/demo/avl"
"gno.land/p/demo/ufmt"
"gno.land/r/demo/teritori/registry"
)

var profiles avl.Tree

func init() {
registry.Register("profiles", RegisterHandler)
}


func Get(dataName string, addr std.Address) interface{} {
if dataName != "profile"{
panic("invalid dataname")
}
profile:=getProfile(addr)

return profile.ToString()
}

func SupportedTypes() []string{
return []string{"profile"}
}

func UpsertProfile(field string, value string){
caller := std.GetOrigCaller()
profile := getProfile(caller)
profile.SetField(field, value)
profiles.Set(caller.String(), profile)
}


func getProfile(addr std.Address ) *Profile {
profile, found:=profiles.Get(addr.String())
if !found{
return &Profile{}
}

return profile.(*Profile)
}

func RegisterHandler(functionName string, args ...interface{}) interface{} {
switch functionName {
case "get":
if len(args) != 2{
panic("invalid number of arguments")
}
dataname := args[0].(string)
address := args[1].(std.Address)
return Get(dataname,address)
case "supportedTypes":
if len(args) != 0{
panic("invalid number of arguments")
}
dataname := args[0].(string)
address := args[1].(std.Address)
return SupportedTypes()
default:
panic("invalid function name")
}
}
27 changes: 27 additions & 0 deletions examples/gno.land/r/demo/teritori/registry/registry.gno
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package registry

import (
"gno.land/p/demo/avl"
"std"
)

var callbacks avl.Tree
type FunctionCB func(functionName string, args ...interface{}) interface{}

func Register(id string, callback FunctionCB){
_,exists:=callbacks.Get(id)
if exists{
panic("A callback already exists for the id")
}

callbacks.Set(id, callback)
}

func Exec(id string, functionName string, args ...interface{}) interface{} {
cb, ok:= callbacks.Get(id)
if !ok{
panic("Callback not found")
}
function := cb.(FunctionCB)
return function(functionName, args)
}
22 changes: 22 additions & 0 deletions examples/gno.land/r/demo/teritori/registry/registry_test.gno
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package registry

import (
"std"
"testing"

"gno.land/p/demo/avl"
"gno.land/p/demo/testutils"
"strings"
)

func TestGetProfile(t *testing.T) {
user1 := testutils.TestAddress("user1")
std.TestSetOrigCaller(user1)
functionID:="SOMEID"
var cb functionCB = func(args ...interface{})[]interface{}{
//t.Errorf("dataType",dataType)
return nil
}
Register(functionID, cb)
Exec(functionID)
}

This file was deleted.

27 changes: 16 additions & 11 deletions examples/gno.land/r/demo/teritori/worx_aggregator/worx.gno
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,9 @@ package worx_aggregator

import(
"gno.land/p/demo/avl"
"gno.land/r/demo/teritori/registry"
"std"
)

//interface WorxDataProvider {
// Get(dataName string, addr std.Address) any
// SupportedTypes() []string
//}

var admin std.Address
var dataProviders []WorxDataProvider
var dataTypeToDataProvider avl.Tree
Expand All @@ -20,18 +16,22 @@ func Get(dataType string, addr std.Address) []any {
if len(dataProviders) == 0 {
panic("there is not dataprovider configured for that datatype")
}
for d := range dataProviders {
all = append(all, d.Get(dataType, addr)...)
for registerID := range dataProviders {
all = append(all, getFromRealm(registerID,dataType, addr)...)
}
return all
}


func RegisterDataProvider(dp WorxDataProvider) {
func RegisterDataProvider(registerRootID string) {
assertAdmin()
for supp := range dp.SupportedTypes() {
supportedTypes := registry.Exec(registerRootID, "supportedTypes")

supportedTypesSlice := supportedTypes.[[]interface{}]
for supp := range supportedTypesSlice {
suppStr:= supp.(string)
providers := dataTypeToDataProvider.Get(supp)
providers = append(providers, dp)
providers = append(providers, registerRootID)
dataTypeToDataProvider.set(supp, providers)
}
}
Expand All @@ -40,4 +40,9 @@ func assertAdmin(){
if (std.PrevRealm().Addr() != admin) {
panic("unathorized")
}
}

func getFromRealm(registerRootID string,dataType string, address std.Address) []any {
getRegisterID := registerRootID
return registry.Exec(getRegisterID, "get", dataType, address)
}

0 comments on commit a59e9a2

Please sign in to comment.