Skip to content

Commit

Permalink
refactor(logic): use fs.File on Open interface
Browse files Browse the repository at this point in the history
  • Loading branch information
bdeneux committed Mar 15, 2023
1 parent a6f522b commit 1c86d46
Show file tree
Hide file tree
Showing 4 changed files with 69 additions and 62 deletions.
64 changes: 6 additions & 58 deletions x/logic/interpreter/fs/fs.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,7 @@ package fs

import (
goctx "context"
"io"
"io/fs"
"time"
)

// FileSystem is the custom virtual file system used into the blockchain.
Expand All @@ -30,70 +28,20 @@ func New(ctx goctx.Context, handlers []URIHandler) FileSystem {
// Open will read the entire file from ReadFile interface,
// Since file is provided by a provider that do not support streams.
func (f FileSystem) Open(name string) (fs.File, error) {
data, err := f.ReadFile(name)
//data, err := f.ReadFile(name)
data, err := f.router.Open(f.ctx, name)
if err != nil {
return nil, &fs.PathError{
Op: "open",
Path: name,
Err: err,
}
}
return Object(data), nil
return data, nil
}

// ReadFile read the entire file at the uri provided.
// Parse all handler and return the first supported handler file response.
func (f FileSystem) ReadFile(name string) ([]byte, error) {
return f.router.Open(f.ctx, name)
}

type Object []byte

type ObjectInfo struct {
name string
size int64
}

func From(object Object) ObjectInfo {
return ObjectInfo{
name: "contract",
size: int64(len(object)),
}
}

func (o ObjectInfo) Name() string {
return o.name
}

func (o ObjectInfo) Size() int64 {
return o.size
}

func (o ObjectInfo) Mode() fs.FileMode {
return fs.ModeIrregular
}

func (o ObjectInfo) ModTime() time.Time {
return time.Now()
}

func (o ObjectInfo) IsDir() bool {
return false
}

func (o ObjectInfo) Sys() any {
return nil
}

func (o Object) Stat() (fs.FileInfo, error) {
return From(o), nil
}

func (o Object) Read(bytes []byte) (int, error) {
copy(bytes, o)
return 0, io.EOF
}

func (o Object) Close() error {
return nil
}
//func (f FileSystem) ReadFile(name string) ([]byte, error) {
// return f.router.Open(f.ctx, name)
//}
56 changes: 56 additions & 0 deletions x/logic/interpreter/fs/object.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
package fs

import (
"bytes"
"io/fs"
"net/url"
"time"
)

type Object struct {
reader *bytes.Reader
uri *url.URL
}

func NewObject(src []byte, uri *url.URL) Object {
return Object{
reader: bytes.NewReader(src),
uri: uri,
}
}

func (o Object) Name() string {
return o.uri.String()
}

func (o Object) Size() int64 {
return o.reader.Size()
}

func (o Object) Mode() fs.FileMode {
return fs.ModeIrregular
}

func (o Object) ModTime() time.Time {
return time.Now() // TODO: change time
}

func (o Object) IsDir() bool {
return false
}

func (o Object) Sys() any {
return nil
}

func (o Object) Stat() (fs.FileInfo, error) {
return o, nil
}

func (o Object) Read(b []byte) (int, error) {
return o.reader.Read(b)
}

func (o Object) Close() error {
return nil
}
5 changes: 3 additions & 2 deletions x/logic/interpreter/fs/router.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,13 @@ package fs
import (
"context"
"fmt"
"io/fs"
"net/url"
)

type URIHandler interface {
Scheme() string
Open(ctx context.Context, uri *url.URL) ([]byte, error)
Open(ctx context.Context, uri *url.URL) (fs.File, error)
}

type Router struct {
Expand All @@ -20,7 +21,7 @@ func NewRouter() Router {
handlers: make(map[string]URIHandler),
}
}
func (r *Router) Open(ctx context.Context, name string) ([]byte, error) {
func (r *Router) Open(ctx context.Context, name string) (fs.File, error) {
uri, err := url.Parse(name)
if err != nil {
return nil, err
Expand Down
6 changes: 4 additions & 2 deletions x/logic/interpreter/fs/wasm.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (
"encoding/base64"
"encoding/json"
"fmt"
"io/fs"
"net/url"
"strings"

Expand All @@ -29,7 +30,7 @@ func (w WasmFS) Scheme() string {
return scheme
}

func (w WasmFS) Open(ctx context.Context, uri *url.URL) ([]byte, error) {
func (w WasmFS) Open(ctx context.Context, uri *url.URL) (fs.File, error) {
sdkCtx := sdk.UnwrapSDKContext(ctx)

if uri.Scheme != scheme {
Expand Down Expand Up @@ -68,5 +69,6 @@ func (w WasmFS) Open(ctx context.Context, uri *url.URL) ([]byte, error) {
if err != nil {
return nil, fmt.Errorf("failed decode wasm base64 respone: %w", err)
}
return decoded, nil

return NewObject(decoded, uri), nil
}

0 comments on commit 1c86d46

Please sign in to comment.