mirror of
https://github.com/wailsapp/wails.git
synced 2025-05-02 19:01:02 +08:00
113 lines
2.4 KiB
Go
113 lines
2.4 KiB
Go
package assetdb
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
"unsafe"
|
|
)
|
|
|
|
// AssetDB is a database for assets encoded as byte slices
|
|
type AssetDB struct {
|
|
db map[string][]byte
|
|
}
|
|
|
|
// NewAssetDB creates a new AssetDB and initialises a blank db
|
|
func NewAssetDB() *AssetDB {
|
|
return &AssetDB{
|
|
db: make(map[string][]byte),
|
|
}
|
|
}
|
|
|
|
// AddAsset saves the given byte slice under the given name
|
|
func (a *AssetDB) AddAsset(name string, data []byte) {
|
|
a.db[name] = data
|
|
}
|
|
|
|
// Remove removes the named asset
|
|
func (a *AssetDB) Remove(name string) {
|
|
delete(a.db, name)
|
|
}
|
|
|
|
// Asset retrieves the byte slice for the given name
|
|
func (a *AssetDB) Read(name string) ([]byte, error) {
|
|
result := a.db[name]
|
|
if result == nil {
|
|
return nil, fmt.Errorf("asset '%s' not found", name)
|
|
}
|
|
return result, nil
|
|
}
|
|
|
|
// AssetAsString returns the asset as a string.
|
|
// It also returns a boolean indicating whether the asset existed or not.
|
|
func (a *AssetDB) String(name string) (string, error) {
|
|
asset, err := a.Read(name)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
return *(*string)(unsafe.Pointer(&asset)), nil
|
|
}
|
|
|
|
func (a *AssetDB) Dump() {
|
|
fmt.Printf("Assets:\n")
|
|
for k, _ := range a.db {
|
|
fmt.Println(k)
|
|
}
|
|
}
|
|
|
|
// Serialize converts the entire database to a file that when compiled will
|
|
// reconstruct the AssetDB during init()
|
|
// name: name of the asset.AssetDB instance
|
|
// pkg: package name placed at the top of the file
|
|
func (a *AssetDB) Serialize(name, pkg string) string {
|
|
var cdata strings.Builder
|
|
// Set buffer size to 4k
|
|
cdata.Grow(4096)
|
|
|
|
// Write header
|
|
header := `// DO NOT EDIT - Generated automatically
|
|
package %s
|
|
|
|
import "github.com/wailsapp/wails/v2/internal/assetdb"
|
|
|
|
var (
|
|
%s *assetdb.AssetDB = assetdb.NewAssetDB()
|
|
)
|
|
|
|
// AssetsDB is a clean interface to the assetdb.AssetDB struct
|
|
type AssetsDB interface {
|
|
Read(string) ([]byte, error)
|
|
String(string) (string, error)
|
|
}
|
|
|
|
// Assets returns the asset database
|
|
func Assets() AssetsDB {
|
|
return %s
|
|
}
|
|
|
|
func init() {
|
|
`
|
|
cdata.WriteString(fmt.Sprintf(header, pkg, name, name))
|
|
|
|
for aname, bytes := range a.db {
|
|
cdata.WriteString(fmt.Sprintf("\t%s.AddAsset(\"%s\", []byte{",
|
|
name,
|
|
aname))
|
|
|
|
l := len(bytes)
|
|
if l == 0 {
|
|
cdata.WriteString("0x00})\n")
|
|
continue
|
|
}
|
|
|
|
// Convert each byte to hex
|
|
for _, b := range bytes[:l-1] {
|
|
cdata.WriteString(fmt.Sprintf("0x%x, ", b))
|
|
}
|
|
cdata.WriteString(fmt.Sprintf("0x%x})\n", bytes[l-1]))
|
|
}
|
|
|
|
cdata.WriteString(`}`)
|
|
|
|
return cdata.String()
|
|
}
|