mirror of
https://github.com/onsonr/sonr.git
synced 2025-03-10 13:07:09 +00:00
Refactored the SonrApp struct by reorganizing and grouping the keepers and other fields.
This commit is contained in:
parent
f6b04e1599
commit
6c1c3d5f8f
90
app/app.go
90
app/app.go
@ -211,66 +211,52 @@ var (
|
|||||||
|
|
||||||
// SonrApp extended ABCI application
|
// SonrApp extended ABCI application
|
||||||
type SonrApp struct {
|
type SonrApp struct {
|
||||||
*baseapp.BaseApp
|
|
||||||
legacyAmino *codec.LegacyAmino
|
|
||||||
appCodec codec.Codec
|
|
||||||
txConfig client.TxConfig
|
|
||||||
interfaceRegistry types.InterfaceRegistry
|
|
||||||
|
|
||||||
// keys to access the substores
|
|
||||||
keys map[string]*storetypes.KVStoreKey
|
|
||||||
tkeys map[string]*storetypes.TransientStoreKey
|
|
||||||
memKeys map[string]*storetypes.MemoryStoreKey
|
|
||||||
|
|
||||||
// keepers
|
|
||||||
AccountKeeper authkeeper.AccountKeeper
|
|
||||||
BankKeeper bankkeeper.BaseKeeper
|
BankKeeper bankkeeper.BaseKeeper
|
||||||
CapabilityKeeper *capabilitykeeper.Keeper
|
AccountKeeper authkeeper.AccountKeeper
|
||||||
|
GroupKeeper groupkeeper.Keeper
|
||||||
|
TokenFactoryKeeper tokenfactorykeeper.Keeper
|
||||||
|
IBCFeeKeeper ibcfeekeeper.Keeper
|
||||||
|
ParamsKeeper paramskeeper.Keeper
|
||||||
|
NFTKeeper nftkeeper.Keeper
|
||||||
|
AuthzKeeper authzkeeper.Keeper
|
||||||
|
FeeGrantKeeper feegrantkeeper.Keeper
|
||||||
|
OracleKeeper oraclekeeper.Keeper
|
||||||
|
interfaceRegistry types.InterfaceRegistry
|
||||||
|
txConfig client.TxConfig
|
||||||
|
appCodec codec.Codec
|
||||||
|
configurator module.Configurator
|
||||||
StakingKeeper *stakingkeeper.Keeper
|
StakingKeeper *stakingkeeper.Keeper
|
||||||
SlashingKeeper slashingkeeper.Keeper
|
tkeys map[string]*storetypes.TransientStoreKey
|
||||||
MintKeeper mintkeeper.Keeper
|
|
||||||
DistrKeeper distrkeeper.Keeper
|
|
||||||
GovKeeper govkeeper.Keeper
|
|
||||||
CrisisKeeper *crisiskeeper.Keeper
|
CrisisKeeper *crisiskeeper.Keeper
|
||||||
UpgradeKeeper *upgradekeeper.Keeper
|
UpgradeKeeper *upgradekeeper.Keeper
|
||||||
ParamsKeeper paramskeeper.Keeper
|
legacyAmino *codec.LegacyAmino
|
||||||
AuthzKeeper authzkeeper.Keeper
|
sm *module.SimulationManager
|
||||||
EvidenceKeeper evidencekeeper.Keeper
|
BasicModuleManager module.BasicManager
|
||||||
FeeGrantKeeper feegrantkeeper.Keeper
|
ModuleManager *module.Manager
|
||||||
GroupKeeper groupkeeper.Keeper
|
*baseapp.BaseApp
|
||||||
NFTKeeper nftkeeper.Keeper
|
CapabilityKeeper *capabilitykeeper.Keeper
|
||||||
ConsensusParamsKeeper consensusparamkeeper.Keeper
|
keys map[string]*storetypes.KVStoreKey
|
||||||
|
PacketForwardKeeper *packetforwardkeeper.Keeper
|
||||||
|
IBCKeeper *ibckeeper.Keeper
|
||||||
|
memKeys map[string]*storetypes.MemoryStoreKey
|
||||||
|
GovKeeper govkeeper.Keeper
|
||||||
|
DidKeeper didkeeper.Keeper
|
||||||
|
POAKeeper poakeeper.Keeper
|
||||||
|
DistrKeeper distrkeeper.Keeper
|
||||||
|
MintKeeper mintkeeper.Keeper
|
||||||
CircuitKeeper circuitkeeper.Keeper
|
CircuitKeeper circuitkeeper.Keeper
|
||||||
|
EvidenceKeeper evidencekeeper.Keeper
|
||||||
IBCKeeper *ibckeeper.Keeper // IBC Keeper must be a pointer in the app, so we can SetRouter on it correctly
|
|
||||||
IBCFeeKeeper ibcfeekeeper.Keeper
|
|
||||||
ICAControllerKeeper icacontrollerkeeper.Keeper
|
|
||||||
ICAHostKeeper icahostkeeper.Keeper
|
ICAHostKeeper icahostkeeper.Keeper
|
||||||
TransferKeeper ibctransferkeeper.Keeper
|
TransferKeeper ibctransferkeeper.Keeper
|
||||||
|
ICAControllerKeeper icacontrollerkeeper.Keeper
|
||||||
// Custom
|
ConsensusParamsKeeper consensusparamkeeper.Keeper
|
||||||
TokenFactoryKeeper tokenfactorykeeper.Keeper
|
|
||||||
POAKeeper poakeeper.Keeper
|
|
||||||
GlobalFeeKeeper globalfeekeeper.Keeper
|
|
||||||
PacketForwardKeeper *packetforwardkeeper.Keeper
|
|
||||||
|
|
||||||
ScopedIBCKeeper capabilitykeeper.ScopedKeeper
|
|
||||||
ScopedICAHostKeeper capabilitykeeper.ScopedKeeper
|
|
||||||
ScopedICAControllerKeeper capabilitykeeper.ScopedKeeper
|
|
||||||
ScopedTransferKeeper capabilitykeeper.ScopedKeeper
|
|
||||||
ScopedIBCFeeKeeper capabilitykeeper.ScopedKeeper
|
ScopedIBCFeeKeeper capabilitykeeper.ScopedKeeper
|
||||||
OracleKeeper oraclekeeper.Keeper
|
ScopedTransferKeeper capabilitykeeper.ScopedKeeper
|
||||||
DidKeeper didkeeper.Keeper
|
ScopedICAControllerKeeper capabilitykeeper.ScopedKeeper
|
||||||
|
SlashingKeeper slashingkeeper.Keeper
|
||||||
// the module manager
|
ScopedICAHostKeeper capabilitykeeper.ScopedKeeper
|
||||||
ModuleManager *module.Manager
|
ScopedIBCKeeper capabilitykeeper.ScopedKeeper
|
||||||
BasicModuleManager module.BasicManager
|
GlobalFeeKeeper globalfeekeeper.Keeper
|
||||||
|
|
||||||
// simulation manager
|
|
||||||
sm *module.SimulationManager
|
|
||||||
|
|
||||||
// module configurator
|
|
||||||
configurator module.Configurator
|
|
||||||
once sync.Once
|
once sync.Once
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
package env
|
package app
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
@ -1,4 +1,4 @@
|
|||||||
package env
|
package app
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/ipfs/kubo/client/rpc"
|
"github.com/ipfs/kubo/client/rpc"
|
||||||
@ -7,7 +7,6 @@ import (
|
|||||||
var (
|
var (
|
||||||
ChainID = "testnet"
|
ChainID = "testnet"
|
||||||
ValAddr = "val1"
|
ValAddr = "val1"
|
||||||
NodeDir = ".sonr"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// Initialize initializes the local configuration values
|
// Initialize initializes the local configuration values
|
@ -22,7 +22,6 @@ import (
|
|||||||
|
|
||||||
"github.com/onsonr/hway/app"
|
"github.com/onsonr/hway/app"
|
||||||
"github.com/onsonr/hway/app/params"
|
"github.com/onsonr/hway/app/params"
|
||||||
"github.com/onsonr/hway/internal/env"
|
|
||||||
// NewRootCmd creates a new root command for chain app. It is called once in the
|
// NewRootCmd creates a new root command for chain app. It is called once in the
|
||||||
// main function.
|
// main function.
|
||||||
)
|
)
|
||||||
@ -100,8 +99,8 @@ func NewRootCmd() *cobra.Command {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Set the context chain ID and validator address
|
// Set the context chain ID and validator address
|
||||||
env.SetLocalChainID(initClientCtx.ChainID)
|
app.SetLocalChainID(initClientCtx.ChainID)
|
||||||
env.SetLocalValidatorAddress(initClientCtx.FromAddress.String())
|
app.SetLocalValidatorAddress(initClientCtx.FromAddress.String())
|
||||||
|
|
||||||
customAppTemplate, customAppConfig := initAppConfig()
|
customAppTemplate, customAppConfig := initAppConfig()
|
||||||
customCMTConfig := initCometBFTConfig()
|
customCMTConfig := initCometBFTConfig()
|
||||||
|
@ -1,96 +0,0 @@
|
|||||||
package vfs
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"io/fs"
|
|
||||||
"os"
|
|
||||||
"path/filepath"
|
|
||||||
|
|
||||||
"github.com/ipfs/boxo/files"
|
|
||||||
)
|
|
||||||
|
|
||||||
// File represents a file in the filesystem
|
|
||||||
type File string
|
|
||||||
|
|
||||||
// NewFile creates a new File instance
|
|
||||||
func NewFile(path string) File {
|
|
||||||
return File(path)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Name returns the name of the file
|
|
||||||
func (f File) Name() string {
|
|
||||||
return filepath.Base(string(f))
|
|
||||||
}
|
|
||||||
|
|
||||||
// Path returns the path of the file
|
|
||||||
func (f File) Path() string {
|
|
||||||
return string(f)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Read reads the contents of the file
|
|
||||||
func (f File) Read() ([]byte, error) {
|
|
||||||
return os.ReadFile(string(f))
|
|
||||||
}
|
|
||||||
|
|
||||||
// Write writes data to the file, but throws an error if the file already exists
|
|
||||||
func (f File) Write(data []byte) error {
|
|
||||||
if f.Exists() {
|
|
||||||
return fmt.Errorf("file already exists: %s", f)
|
|
||||||
}
|
|
||||||
return os.WriteFile(string(f), data, 0644)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Append appends data to the file
|
|
||||||
func (f File) Append(data []byte) error {
|
|
||||||
file, err := os.OpenFile(string(f), os.O_APPEND|os.O_WRONLY|os.O_CREATE, 0644)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
defer file.Close()
|
|
||||||
|
|
||||||
_, err = file.Write(data)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Overwrite deletes all data for the file at path if it exists and writes the new data
|
|
||||||
func (f File) Overwrite(data []byte) error {
|
|
||||||
// If the file exists, remove it first
|
|
||||||
if f.Exists() {
|
|
||||||
if err := f.Remove(); err != nil {
|
|
||||||
return fmt.Errorf("failed to remove existing file: %w", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Write the new data
|
|
||||||
return os.WriteFile(string(f), data, 0644)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Exists checks if the file exists
|
|
||||||
func (f File) Exists() bool {
|
|
||||||
_, err := os.Stat(string(f))
|
|
||||||
return !os.IsNotExist(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Remove removes the file
|
|
||||||
func (f File) Remove() error {
|
|
||||||
return os.Remove(string(f))
|
|
||||||
}
|
|
||||||
|
|
||||||
// Stat returns the FileInfo for the file
|
|
||||||
func (f File) Stat() (os.FileInfo, error) {
|
|
||||||
return os.Stat(string(f))
|
|
||||||
}
|
|
||||||
|
|
||||||
// Open opens the file and returns an fs.File
|
|
||||||
func (f File) Open() (fs.File, error) {
|
|
||||||
return os.Open(string(f))
|
|
||||||
}
|
|
||||||
|
|
||||||
// Node returns a files.Node representation of the file
|
|
||||||
func (f File) Node() (files.Node, error) {
|
|
||||||
file, err := os.Open(string(f))
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return files.NewReaderFile(file), nil
|
|
||||||
}
|
|
@ -1,120 +0,0 @@
|
|||||||
package vfs
|
|
||||||
|
|
||||||
import (
|
|
||||||
"io/fs"
|
|
||||||
"os"
|
|
||||||
"path/filepath"
|
|
||||||
|
|
||||||
"github.com/ipfs/boxo/files"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Folder represents a folder in the filesystem
|
|
||||||
type Folder string
|
|
||||||
|
|
||||||
// NewFolder creates a new Folder instance
|
|
||||||
func NewFolder(path string) Folder {
|
|
||||||
return Folder(path)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Name returns the name of the folder
|
|
||||||
func (f Folder) Name() string {
|
|
||||||
return filepath.Base(string(f))
|
|
||||||
}
|
|
||||||
|
|
||||||
// Path returns the path of the folder
|
|
||||||
func (f Folder) Path() string {
|
|
||||||
return string(f)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create creates the folder if it doesn't exist
|
|
||||||
func (f Folder) Create() error {
|
|
||||||
return os.MkdirAll(string(f), os.ModePerm)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Exists checks if the folder exists
|
|
||||||
func (f Folder) Exists() bool {
|
|
||||||
info, err := os.Stat(string(f))
|
|
||||||
return err == nil && info.IsDir()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Ls lists the contents of the folder
|
|
||||||
func (f Folder) Ls() ([]fs.DirEntry, error) {
|
|
||||||
return os.ReadDir(string(f))
|
|
||||||
}
|
|
||||||
|
|
||||||
// WriteFile writes data to a file in the folder
|
|
||||||
func (f Folder) WriteFile(name string, data []byte, perm os.FileMode) (File, error) {
|
|
||||||
err := os.WriteFile(filepath.Join(string(f), name), data, perm)
|
|
||||||
return File(filepath.Join(string(f), name)), err
|
|
||||||
}
|
|
||||||
|
|
||||||
// ReadFile reads the contents of a file in the folder
|
|
||||||
func (f Folder) ReadFile(name string) ([]byte, error) {
|
|
||||||
return os.ReadFile(filepath.Join(string(f), name))
|
|
||||||
}
|
|
||||||
|
|
||||||
// DeleteFile deletes a file from the folder
|
|
||||||
func (f Folder) DeleteFile(name string) error {
|
|
||||||
return os.Remove(filepath.Join(string(f), name))
|
|
||||||
}
|
|
||||||
|
|
||||||
// Remove removes the folder and its contents
|
|
||||||
func (f Folder) Remove() error {
|
|
||||||
return os.RemoveAll(string(f))
|
|
||||||
}
|
|
||||||
|
|
||||||
// Join joins the folder path with the given elements
|
|
||||||
func (f Folder) Join(elem ...string) Folder {
|
|
||||||
return Folder(filepath.Join(append([]string{string(f)}, elem...)...))
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsDir checks if the folder is a directory
|
|
||||||
func (f Folder) IsDir() bool {
|
|
||||||
info, err := os.Stat(string(f))
|
|
||||||
return err == nil && info.IsDir()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Touch creates an empty file if it doesn't exist, or updates its access and modification times if it does
|
|
||||||
func (f Folder) Touch(name string) (File, error) {
|
|
||||||
var err error
|
|
||||||
filePath := filepath.Join(string(f), name)
|
|
||||||
_, err = os.Stat(filePath)
|
|
||||||
if os.IsNotExist(err) {
|
|
||||||
file, err := os.Create(filePath)
|
|
||||||
if err != nil {
|
|
||||||
return File(filePath), err
|
|
||||||
}
|
|
||||||
if err := file.Close(); err != nil {
|
|
||||||
return File(filePath), err
|
|
||||||
}
|
|
||||||
return File(filePath), nil
|
|
||||||
}
|
|
||||||
return File(filePath), err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Node returns a files.Node representation of the folder
|
|
||||||
func (f Folder) Node() (files.Node, error) {
|
|
||||||
entries, err := f.Ls()
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
dirEntries := make([]files.DirEntry, 0, len(entries))
|
|
||||||
for _, entry := range entries {
|
|
||||||
if entry.IsDir() {
|
|
||||||
subFolder := f.Join(entry.Name())
|
|
||||||
subNode, err := subFolder.Node()
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
dirEntries = append(dirEntries, files.FileEntry(entry.Name(), subNode))
|
|
||||||
} else {
|
|
||||||
file := File(filepath.Join(string(f), entry.Name()))
|
|
||||||
fileNode, err := file.Node()
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
dirEntries = append(dirEntries, files.FileEntry(entry.Name(), fileNode))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return files.NewSliceDirectory(dirEntries), nil
|
|
||||||
}
|
|
@ -1,93 +0,0 @@
|
|||||||
package vfs
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"os"
|
|
||||||
"path/filepath"
|
|
||||||
|
|
||||||
"github.com/ipfs/boxo/path"
|
|
||||||
"github.com/ipfs/kubo/core/coreiface/options"
|
|
||||||
"github.com/onsonr/hway/internal/env"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Constant for the name of the folder where the vaults are stored
|
|
||||||
const kVaultsFolderName = ".sonr-vaults"
|
|
||||||
|
|
||||||
// enclaveRoot is the folder where the vaults are stored
|
|
||||||
var enclaveRoot Folder
|
|
||||||
|
|
||||||
// Package initializes the VaultsFolder
|
|
||||||
func init() {
|
|
||||||
// Initialize VaultsFolder
|
|
||||||
homeDir, err := os.UserHomeDir()
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create the folder if it does not exist
|
|
||||||
enclaveRoot = NewFolder(filepath.Join(homeDir, kVaultsFolderName))
|
|
||||||
if !enclaveRoot.Exists() {
|
|
||||||
if err := enclaveRoot.Create(); err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewVaultFolder creates a new folder under the VaultsFolder directory
|
|
||||||
func NewVaultFolder(name string) (Folder, error) {
|
|
||||||
vaultFolder := enclaveRoot.Join(name)
|
|
||||||
err := vaultFolder.Create()
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
return vaultFolder, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// SaveToIPFS saves the Folder to IPFS and returns the IPFS path
|
|
||||||
func SyncFolderToIPFS(ctx context.Context, f Folder) (path.Path, error) {
|
|
||||||
node, err := f.Node()
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
c, err := env.GetIPFSClient()
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
path, err := c.Unixfs().Add(ctx, node)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return path, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// PublishToIPNS publishes the Folder to IPNS
|
|
||||||
func PublishToIPNS(ctx context.Context, ipfsPath path.Path, f Folder) error {
|
|
||||||
c, err := env.GetIPFSClient()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
_, err = c.Name().Publish(ctx, ipfsPath, options.Name.Key(f.Name()))
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// LoadFromIPFS loads a Folder from IPFS
|
|
||||||
func LoadFromIPFS(ctx context.Context, path string) (Folder, error) {
|
|
||||||
c, err := env.GetIPFSClient()
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
cid, err := ParsePath(path)
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
node, err := c.Unixfs().Get(ctx, cid)
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
return LoadNodeInFolder(path, node)
|
|
||||||
}
|
|
@ -1,58 +0,0 @@
|
|||||||
package vfs
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"io"
|
|
||||||
"os"
|
|
||||||
"path/filepath"
|
|
||||||
|
|
||||||
"github.com/ipfs/boxo/files"
|
|
||||||
"github.com/ipfs/boxo/path"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Helper function to parse IPFS path
|
|
||||||
func ParsePath(p string) (path.Path, error) {
|
|
||||||
return path.NewPath(p)
|
|
||||||
}
|
|
||||||
|
|
||||||
// FetchVaultPath returns the path to the vault with the given name
|
|
||||||
func FetchVaultPath(name string) string {
|
|
||||||
return enclaveRoot.Join(name).Path()
|
|
||||||
}
|
|
||||||
|
|
||||||
// LoadNodeInFolder loads an IPFS node into a Folder
|
|
||||||
func LoadNodeInFolder(path string, node files.Node) (Folder, error) {
|
|
||||||
folder := NewFolder(path)
|
|
||||||
if err := folder.Create(); err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
|
|
||||||
switch n := node.(type) {
|
|
||||||
case files.File:
|
|
||||||
f, err := os.Create(folder.Path())
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
defer f.Close()
|
|
||||||
if _, err := io.Copy(f, n); err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
case files.Directory:
|
|
||||||
entries := n.Entries()
|
|
||||||
for entries.Next() {
|
|
||||||
name := entries.Name()
|
|
||||||
childNode := entries.Node()
|
|
||||||
childPath := filepath.Join(folder.Path(), name)
|
|
||||||
if _, err := LoadNodeInFolder(childPath, childNode); err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if entries.Err() != nil {
|
|
||||||
return "", entries.Err()
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
return "", fmt.Errorf("unsupported node type: %T", n)
|
|
||||||
}
|
|
||||||
|
|
||||||
return folder, nil
|
|
||||||
}
|
|
Loading…
x
Reference in New Issue
Block a user