From 6c84e18ce85a8f9e0fe09d5f3c281acf70316bf3 Mon Sep 17 00:00:00 2001
From: grngxd <36968271+grngxd@users.noreply.github.com>
Date: Mon, 16 Jun 2025 23:46:07 +0100
Subject: [PATCH] basic fs
---
example/index.html | 32 ++++++++++++++++++++++++++++
example/main.go | 30 ++++++++------------------
runtime/index.d.ts | 9 +++++++-
runtime/preload.ts | 6 +++++-
tiramisu.go | 53 ++++++++++++++++++++++++++++++++++++++++++----
5 files changed, 103 insertions(+), 27 deletions(-)
create mode 100644 example/index.html
diff --git a/example/index.html b/example/index.html
new file mode 100644
index 0000000..af6d2e8
--- /dev/null
+++ b/example/index.html
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/example/main.go b/example/main.go
index c5bff7c..da18ba3 100644
--- a/example/main.go
+++ b/example/main.go
@@ -3,16 +3,21 @@ package main
import (
"fmt"
+ _ "embed"
+
t "git.iwakura.rip/grng/tiramisu"
webview "github.com/webview/webview_go"
)
+//go:embed index.html
+var html string
+
func main() {
app := t.New(t.TiramisuOptions{
Debug: true,
- Width: 1200,
- Height: 800,
- Title: "Tiramisu Example",
+ Width: 800,
+ Height: 600,
+ Title: "Tiramisu",
Hints: webview.HintFixed,
})
@@ -27,23 +32,6 @@ func main() {
return "Hello, unknown!", nil
})
- app.HTML(`
-
-
-
- Tiramisu Example
- Click the button to see a greeting:
-
-
-
-
-
- `)
+ app.HTML(html)
})
}
diff --git a/runtime/index.d.ts b/runtime/index.d.ts
index afb0fc3..a6fe80f 100644
--- a/runtime/index.d.ts
+++ b/runtime/index.d.ts
@@ -1,8 +1,15 @@
declare global {
interface Window {
- invoke: (name: string, ...args: any[]) => Promise;
+ __TIRAMISU_INTERNAL_invoke: (name: string, ...args: any[]) => Promise;
+ __TIRAMISU_INTERNAL_readFile: (path: string) => Promise;
+ __TIRAMISU_INTERNAL_readDir: (path: string) => Promise;
+
tiramisu: {
invoke: (name: string, ...args: any[]) => Promise;
+ fs: {
+ readFile(path: string): Promise;
+ readDir(path: string): Promise;
+ }
};
}
}
diff --git a/runtime/preload.ts b/runtime/preload.ts
index 99e6691..ec9dad9 100644
--- a/runtime/preload.ts
+++ b/runtime/preload.ts
@@ -1,5 +1,9 @@
const tiramisu = {
- invoke: window.invoke
+ invoke: window.__TIRAMISU_INTERNAL_invoke,
+ fs: {
+ readFile: window.__TIRAMISU_INTERNAL_readFile,
+ readDir: window.__TIRAMISU_INTERNAL_readDir
+ }
}
window.tiramisu = tiramisu
\ No newline at end of file
diff --git a/tiramisu.go b/tiramisu.go
index 8b42e76..5fc900d 100644
--- a/tiramisu.go
+++ b/tiramisu.go
@@ -3,6 +3,7 @@ package tiramisu
import (
"embed"
"fmt"
+ "os"
wv "github.com/webview/webview_go"
)
@@ -38,7 +39,8 @@ func New(o TiramisuOptions) *Tiramisu {
func (t *Tiramisu) Run(fn func()) {
defer t.w.Destroy()
t.w.Dispatch(func() {
- t.injectJS()
+ t.loadJSRuntime()
+ t.loadGoRuntime()
if fn != nil {
fn()
@@ -85,20 +87,24 @@ func (t *Tiramisu) Evalf(js string, args ...any) {
func (t *Tiramisu) HTML(html string) {
t.w.SetHtml(html)
- t.injectJS()
+ t.loadJSRuntime()
+ t.loadGoRuntime()
}
//go:embed runtime/out/*
var runtimeFS embed.FS
-func (t *Tiramisu) injectJS() {
+func (t *Tiramisu) loadJSRuntime() {
js, err := runtimeFS.ReadFile("runtime/out/preload.js")
if err != nil {
panic(fmt.Sprintf("failed to read preload.js: %v", err))
}
t.w.Eval(string(js))
- t.bind("invoke", func(args ...any) (any, error) {
+}
+
+func (t *Tiramisu) loadGoRuntime() {
+ t.bind("__TIRAMISU_INTERNAL_invoke", func(args ...any) (any, error) {
name, ok := args[0].(string)
if !ok {
return nil, fmt.Errorf("first argument must be a string, got %T", args[0])
@@ -108,4 +114,43 @@ func (t *Tiramisu) injectJS() {
}
return t.invoke(name, args[1:]...)
})
+
+ t.bind("__TIRAMISU_INTERNAL_readFile", func(args ...any) (any, error) {
+ if len(args) != 1 {
+ return nil, fmt.Errorf("readFile expects exactly one argument, got %d", len(args))
+ }
+
+ filename, ok := args[0].(string)
+ if !ok {
+ return nil, fmt.Errorf("readFile expects a string argument, got %T", args[0])
+ }
+
+ data, err := os.ReadFile(filename)
+ if err != nil {
+ return nil, fmt.Errorf("error reading file %s: %w", filename, err)
+ }
+ return string(data), nil
+ })
+
+ t.bind("__TIRAMISU_INTERNAL_readDir", func(args ...any) (any, error) {
+ if len(args) != 1 {
+ return nil, fmt.Errorf("readDir expects exactly one argument, got %d", len(args))
+ }
+
+ dirname, ok := args[0].(string)
+ if !ok {
+ return nil, fmt.Errorf("readDir expects a string argument, got %T", args[0])
+ }
+
+ files, err := os.ReadDir(dirname)
+ if err != nil {
+ return nil, fmt.Errorf("error reading directory %s: %w", dirname, err)
+ }
+
+ var fileNames []string
+ for _, file := range files {
+ fileNames = append(fileNames, file.Name())
+ }
+ return fileNames, nil
+ })
}