Skip to content

Commit abe4da2

Browse files
authored
Add options for Loader (#62)
This commit adds tiled.WithFileSystem which allows users to pass a fs.FS or embed.FS object like this //go:embed data var data embed.FS ... m, err := tiled.LoadFile(path, tiled.WithFileSystem(data)) Rename LoadFromFile and LoadFromReader
1 parent 8f6d20a commit abe4da2

File tree

6 files changed

+64
-40
lines changed

6 files changed

+64
-40
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ const mapPath = "maps/map.tmx" // Path to your Tiled Map.
3030

3131
func main() {
3232
// Parse .tmx file.
33-
gameMap, err := tiled.LoadFromFile(mapPath)
33+
gameMap, err := tiled.LoadFile(mapPath)
3434
if err != nil {
3535
fmt.Printf("error parsing map: %s", err.Error()
3636
os.Exit(2)

example/tmx2img/main.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ func main() {
1818
img = "map.png"
1919
}
2020

21-
m, err := tiled.LoadFromFile(filename)
21+
m, err := tiled.LoadFile(filename)
2222
if err != nil {
2323
fmt.Println(err)
2424
return

tiled.go

Lines changed: 34 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -30,38 +30,58 @@ import (
3030
"path/filepath"
3131
)
3232

33-
// LoadFromReader function loads tiled map in TMX format from io.Reader
33+
// LoadReader function loads tiled map in TMX format from io.Reader
3434
// baseDir is used for loading additional tile data, current directory is used if empty
35-
func LoadFromReader(baseDir string, r io.Reader) (*Map, error) {
36-
return (*Loader)(nil).LoadFromReader(baseDir, r)
35+
func LoadReader(baseDir string, r io.Reader, options ...LoaderOption) (*Map, error) {
36+
l := newLoader(options...)
37+
return l.LoadReader(baseDir, r)
3738
}
3839

39-
// LoadFromFile function loads tiled map in TMX format from file
40-
func LoadFromFile(fileName string) (*Map, error) {
41-
return (*Loader)(nil).LoadFromFile(fileName)
40+
// LoadFile function loads tiled map in TMX format from file
41+
func LoadFile(fileName string, options ...LoaderOption) (*Map, error) {
42+
l := newLoader(options...)
43+
return l.LoadFile(fileName)
4244
}
4345

44-
// Loader provides configuration on how TMX maps and resources are loaded.
45-
type Loader struct {
46+
// loader provides configuration on how TMX maps and resources are loaded.
47+
type loader struct {
4648
// A FileSystem that is used for loading TMX files and any external
4749
// resources it may reference.
4850
//
4951
// A nil FileSystem uses the local file system.
5052
FileSystem fs.FS
5153
}
5254

55+
// LoaderOption is used with LoadReader and LoadFile functions to pass additional options
56+
type LoaderOption func(*loader)
57+
58+
func newLoader(options ...LoaderOption) *loader {
59+
l := &loader{}
60+
for _, opt := range options {
61+
opt(l)
62+
}
63+
return l
64+
}
65+
5366
// open opens the given file using the Loader's FileSystem, or uses os.Open
5467
// if l or l.FileSystem is nil.
55-
func (l *Loader) open(name string) (fs.File, error) {
68+
func (l *loader) open(name string) (fs.File, error) {
5669
if l == nil || l.FileSystem == nil {
5770
return os.Open(name)
5871
}
5972
return l.FileSystem.Open(name)
6073
}
6174

62-
// LoadFromReader function loads tiled map in TMX format from io.Reader
75+
// WithFileSystem returns an option to load level from a passed filesystem
76+
func WithFileSystem(fileSystem fs.FS) LoaderOption {
77+
return func(l *loader) {
78+
l.FileSystem = fileSystem
79+
}
80+
}
81+
82+
// LoadReader function loads tiled map in TMX format from io.Reader
6383
// baseDir is used for loading additional tile data, current directory is used if empty
64-
func (l *Loader) LoadFromReader(baseDir string, r io.Reader) (*Map, error) {
84+
func (l *loader) LoadReader(baseDir string, r io.Reader) (*Map, error) {
6585
d := xml.NewDecoder(r)
6686

6787
m := &Map{
@@ -75,14 +95,14 @@ func (l *Loader) LoadFromReader(baseDir string, r io.Reader) (*Map, error) {
7595
return m, nil
7696
}
7797

78-
// LoadFromFile function loads tiled map in TMX format from file
79-
func (l *Loader) LoadFromFile(fileName string) (*Map, error) {
98+
// LoadFile function loads tiled map in TMX format from file
99+
func (l *loader) LoadFile(fileName string) (*Map, error) {
80100
f, err := l.open(fileName)
81101
if err != nil {
82102
return nil, err
83103
}
84104
defer f.Close()
85105

86106
dir := filepath.Dir(fileName)
87-
return l.LoadFromReader(dir, f)
107+
return l.LoadReader(dir, f)
88108
}

tiled_test.go

Lines changed: 26 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ func GetAssetsDirectory() string {
4141
return filepath.Join(filepath.Dir(filename), "assets")
4242
}
4343

44-
func TestLoadFromReader(t *testing.T) {
44+
func TestLoadReader(t *testing.T) {
4545
r := bytes.NewBufferString(`<?xml version="1.0" encoding="UTF-8"?>
4646
<map version="1.2" tiledversion="1.2.1" orientation="orthogonal" renderorder="right-down" width="4" height="4" tilewidth="16" tileheight="16" infinite="0" nextlayerid="2" nextobjectid="2">
4747
<layer id="1" name="Tile Layer 1" width="4" height="4">
@@ -53,28 +53,28 @@ func TestLoadFromReader(t *testing.T) {
5353
</data>
5454
</layer>
5555
</map>`)
56-
m, err := LoadFromReader(GetAssetsDirectory(), r)
56+
m, err := LoadReader(GetAssetsDirectory(), r)
5757

5858
assert.NoError(t, err)
5959
assert.NotNil(t, m)
6060
assert.Len(t, m.Layers, 1)
6161
}
6262

63-
func TestLoadFromReaderError(t *testing.T) {
63+
func TestLoadReaderError(t *testing.T) {
6464
r := bytes.NewBufferString(`<?xml version="1.0" encoding="UTF-8"?>
6565
<map version="1.2" tiledversion="1.2.1" orientation="orthogonal" renderorder="right-down" width="4" height="4" tilewidth="16" tileheight="16" infinite="0" nextlayerid="2" nextobjectid="2">
6666
<layer id="1" name="Tile Layer 1" width="4" height="4">
6767
<data encoding="csv">
6868
</layer>
6969
</map>`)
70-
m, err := LoadFromReader(GetAssetsDirectory(), r)
70+
m, err := LoadReader(GetAssetsDirectory(), r)
7171

7272
assert.Error(t, err)
7373
assert.Nil(t, m)
7474
}
7575

76-
func TestLoadFromFile(t *testing.T) {
77-
m, err := LoadFromFile(filepath.Join(GetAssetsDirectory(), "test.tmx"))
76+
func TestLoadFile(t *testing.T) {
77+
m, err := LoadFile(filepath.Join(GetAssetsDirectory(), "test.tmx"))
7878

7979
assert.NoError(t, err)
8080
assert.NotNil(t, m)
@@ -93,15 +93,15 @@ func TestLoadFromFile(t *testing.T) {
9393
assert.Equal(t, true, m.ObjectGroups[0].Objects[0].Visible)
9494
}
9595

96-
func TestLoadFromFileError(t *testing.T) {
97-
m, err := LoadFromFile(filepath.Join(GetAssetsDirectory(), "invalid.tmx"))
96+
func TestLoadFileError(t *testing.T) {
97+
m, err := LoadFile(filepath.Join(GetAssetsDirectory(), "invalid.tmx"))
9898

9999
assert.Error(t, err)
100100
assert.Nil(t, m)
101101
}
102102

103103
func TestExternalTilesetImageLoaded(t *testing.T) {
104-
m, err := LoadFromFile(filepath.Join(GetAssetsDirectory(), "test2.tmx"))
104+
m, err := LoadFile(filepath.Join(GetAssetsDirectory(), "test2.tmx"))
105105

106106
assert.NoError(t, err)
107107
assert.NotNil(t, m)
@@ -123,7 +123,7 @@ func TestExternalTilesetImageLoaded(t *testing.T) {
123123
}
124124

125125
func TestImageLayer(t *testing.T) {
126-
m, err := LoadFromFile(filepath.Join(GetAssetsDirectory(), "imagelayer.tmx"))
126+
m, err := LoadFile(filepath.Join(GetAssetsDirectory(), "imagelayer.tmx"))
127127

128128
assert.NoError(t, err)
129129
assert.NotNil(t, m)
@@ -145,7 +145,7 @@ func TestImageLayer(t *testing.T) {
145145
}
146146

147147
func TestGroup(t *testing.T) {
148-
m, err := LoadFromFile(filepath.Join(GetAssetsDirectory(), "groups.tmx"))
148+
m, err := LoadFile(filepath.Join(GetAssetsDirectory(), "groups.tmx"))
149149

150150
assert.NoError(t, err)
151151
assert.NotNil(t, m)
@@ -178,7 +178,7 @@ func TestGroup(t *testing.T) {
178178
}
179179

180180
func TestFont(t *testing.T) {
181-
m, err := LoadFromFile(filepath.Join(GetAssetsDirectory(), "font.tmx"))
181+
m, err := LoadFile(filepath.Join(GetAssetsDirectory(), "font.tmx"))
182182

183183
assert.NoError(t, err)
184184
assert.NotNil(t, m)
@@ -219,12 +219,12 @@ func (t *testFileSystem) Open(filename string) (fs.File, error) {
219219

220220
func TestLoader(t *testing.T) {
221221
fs := &testFileSystem{}
222-
loader := &Loader{
222+
loader := &loader{
223223
FileSystem: fs,
224224
}
225225

226226
mapFile := filepath.Join(GetAssetsDirectory(), "loader.tmx")
227-
m, err := loader.LoadFromFile(mapFile)
227+
m, err := loader.LoadFile(mapFile)
228228

229229
if assert.Error(t, err) {
230230
assert.True(t, os.IsNotExist(err), "expecting no exist error")
@@ -238,27 +238,24 @@ func TestLoader(t *testing.T) {
238238
var assetsFS embed.FS
239239

240240
func TestEmbeddedLoader(t *testing.T) {
241-
loader := &Loader{
242-
FileSystem: assetsFS,
243-
}
244241
tcs := []struct {
245242
name string
246243
load func() (*Map, error)
247244
}{
248245
{
249-
name: "LoadFromReader",
246+
name: "LoadReader",
250247
load: func() (*Map, error) {
251248
file, err := assetsFS.Open("assets/test2.tmx")
252249
if err != nil {
253250
return nil, err
254251
}
255-
return loader.LoadFromReader("assets", file)
252+
return LoadReader("assets", file, WithFileSystem(assetsFS))
256253
},
257254
},
258255
{
259-
name: "LoadFromFile",
256+
name: "LoadFile",
260257
load: func() (*Map, error) {
261-
return loader.LoadFromFile("assets/test2.tmx")
258+
return LoadFile("assets/test2.tmx", WithFileSystem(assetsFS))
262259
},
263260
},
264261
}
@@ -279,6 +276,13 @@ func TestEmbeddedLoader(t *testing.T) {
279276
}
280277
}
281278

279+
func TestLoadFileMissingFile(t *testing.T) {
280+
_, err := LoadFile("missing-file.tmx")
281+
if err == nil {
282+
t.Fatal("expected LoadFile to return err, but no error was returned")
283+
}
284+
}
285+
282286
func TestParseHexColor(t *testing.T) {
283287
type test struct {
284288
name string
@@ -411,7 +415,7 @@ func TestFormatHexColor(t *testing.T) {
411415
}
412416

413417
func TestVersions(t *testing.T) {
414-
m, err := LoadFromFile(filepath.Join(GetAssetsDirectory(), "test2.tmx"))
418+
m, err := LoadFile(filepath.Join(GetAssetsDirectory(), "test2.tmx"))
415419

416420
assert.Nil(t, err)
417421

tmx_map.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ var (
4747
// layers are rendered by Tiled
4848
type Map struct {
4949
// Loader for loading additional data
50-
loader *Loader
50+
loader *loader
5151
// Base directory for loading additional data
5252
baseDir string
5353

tmx_object_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import (
1414
func TestLoadTilesetReferencedOnlyByObjectGroup(t *testing.T) {
1515
const mapPath = "assets/test_tileobject.tmx"
1616

17-
m, err := tiled.LoadFromFile(mapPath)
17+
m, err := tiled.LoadFile(mapPath)
1818
if err != nil {
1919
t.Fatal(err)
2020
}

0 commit comments

Comments
 (0)