47 lines
979 B
Go
47 lines
979 B
Go
package workspaces
|
|
|
|
import (
|
|
"github.com/asdine/storm"
|
|
"github.com/pkg/errors"
|
|
"log"
|
|
"os"
|
|
)
|
|
|
|
type MetaInfo struct {
|
|
Command string
|
|
}
|
|
|
|
type Manager struct {
|
|
metainfo MetaInfo
|
|
}
|
|
|
|
func New(metaInfo MetaInfo) *Manager {
|
|
return &Manager{metainfo: metaInfo}
|
|
}
|
|
|
|
func (m *Manager) OpenOrCreate(filename string) (*Workspace, error) {
|
|
if filename == "" {
|
|
return m.CreateTemp()
|
|
}
|
|
return m.Open(filename)
|
|
}
|
|
|
|
func (m *Manager) Open(filename string) (*Workspace, error) {
|
|
db, err := storm.Open(filename)
|
|
if err != nil {
|
|
return nil, errors.Wrapf(err, "cannot open workspace at %v", filename)
|
|
}
|
|
log.Printf("open workspace: %v", filename)
|
|
return &Workspace{db: db}, nil
|
|
}
|
|
|
|
func (m *Manager) CreateTemp() (*Workspace, error) {
|
|
workspaceFile, err := os.CreateTemp("", m.metainfo.Command+"*.workspace")
|
|
if err != nil {
|
|
return nil, errors.Wrapf(err, "cannot create workspace file")
|
|
}
|
|
workspaceFile.Close() // We just need the filename
|
|
|
|
return m.Open(workspaceFile.Name())
|
|
}
|