95 lines
2.0 KiB
Go
95 lines
2.0 KiB
Go
|
package protocoldb
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"io/fs"
|
||
|
"os"
|
||
|
"path/filepath"
|
||
|
|
||
|
"gitea.mmo.to/ProtocolPacketForger/ppf/protocol"
|
||
|
"gitea.mmo.to/ProtocolPacketForger/ppf/protocolctl"
|
||
|
)
|
||
|
|
||
|
type PPFDatabases struct {
|
||
|
Databases []ProtocolDatabaseProvider
|
||
|
}
|
||
|
|
||
|
type ProtocolDatabaseProvider interface {
|
||
|
Open(path string) error
|
||
|
Close() error
|
||
|
Protocols() map[string]protocol.DOPMeta
|
||
|
}
|
||
|
|
||
|
type ProtocolDatabaseManager interface {
|
||
|
Add(prot *protocol.ProtocolStructure, path string)
|
||
|
Update(prot *protocol.ProtocolStructure, path string)
|
||
|
// no remove.
|
||
|
UpdateDatabase() error // scans for new protocols
|
||
|
}
|
||
|
|
||
|
type DatabaseEntry struct {
|
||
|
Path string
|
||
|
Protocol protocol.DOPMeta
|
||
|
}
|
||
|
|
||
|
// FileDatabase implements ProtocolDatabaseProvider and ProtocolDatabaseManager
|
||
|
type FileDatabase struct {
|
||
|
Path string
|
||
|
protocols map[string]DatabaseEntry
|
||
|
closed bool
|
||
|
}
|
||
|
|
||
|
type FileDatabaseFromGitRemote struct {
|
||
|
FileDatabase
|
||
|
RemoteGitRepository string
|
||
|
}
|
||
|
|
||
|
func (fd *FileDatabase) Open(path string) error {
|
||
|
fileinfo, err := os.Stat(path)
|
||
|
if err == os.ErrNotExist {
|
||
|
return err
|
||
|
}
|
||
|
if !fileinfo.IsDir() {
|
||
|
return fmt.Errorf("Path %s is not a directory", path)
|
||
|
}
|
||
|
fd.Path = path
|
||
|
fd.closed = false
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func (fd *FileDatabase) Close() error {
|
||
|
for k := range fd.protocols {
|
||
|
delete(fd.protocols, k)
|
||
|
}
|
||
|
fd.closed = true
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func (fd *FileDatabase) Protocols() map[string]DatabaseEntry {
|
||
|
if !fd.closed {
|
||
|
fd.protocols = map[string]DatabaseEntry{}
|
||
|
// recurse recursively through the path
|
||
|
filepath.Walk(fd.Path, func(path string, info fs.FileInfo, err error) error {
|
||
|
if !info.IsDir() {
|
||
|
prot, err := protocolctl.LoadNew(path)
|
||
|
if err != nil {
|
||
|
// add to map
|
||
|
fd.protocols[prot.Metadata.Name] = DatabaseEntry{path, prot.Metadata}
|
||
|
}
|
||
|
}
|
||
|
return nil
|
||
|
})
|
||
|
}
|
||
|
return fd.protocols
|
||
|
}
|
||
|
|
||
|
func (fd *FileDatabase) Add(prot *protocol.ProtocolStructure, path string) {
|
||
|
|
||
|
}
|
||
|
func (fd *FileDatabase) Update(prot *protocol.ProtocolStructure, path string) {
|
||
|
|
||
|
}
|
||
|
func (fd *FileDatabase) UpdateDatabase() error {
|
||
|
|
||
|
}
|