51 lines
794 B
Go
51 lines
794 B
Go
|
package filesystem
|
||
|
|
||
|
import (
|
||
|
"bytes"
|
||
|
"io"
|
||
|
|
||
|
"github.com/icza/mpq"
|
||
|
)
|
||
|
|
||
|
type FileSystem interface {
|
||
|
Mount(root, path string) error
|
||
|
List() ([]string, error)
|
||
|
Open(path string) (io.ReadSeeker, error)
|
||
|
}
|
||
|
|
||
|
func New() FileSystem {
|
||
|
return new(filesystem)
|
||
|
}
|
||
|
|
||
|
type filesystem struct {
|
||
|
db *mpq.MPQ
|
||
|
}
|
||
|
|
||
|
func (fs *filesystem) Mount(root, path string) error {
|
||
|
db, err := mpq.NewFromFile(path)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
fs.db = db
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func (fs *filesystem) List() ([]string, error) {
|
||
|
data, err := fs.db.FileByName("(listfile)")
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
return []string{string(data)}, nil
|
||
|
}
|
||
|
|
||
|
func (fs *filesystem) Open(path string) (io.ReadSeeker, error) {
|
||
|
data, err := fs.db.FileByName(path)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
return bytes.NewReader(data), nil
|
||
|
}
|