create basic controller
This commit is contained in:
+38
-2
@@ -21,13 +21,14 @@ func NewStateError(msg string) error {
|
||||
|
||||
type Storage interface {
|
||||
Lock() (func() error, error)
|
||||
Exist(string) (bool, error)
|
||||
Exists(string) (bool, error)
|
||||
Write(string, encoding.BinaryMarshaler) error
|
||||
Read(string, encoding.BinaryUnmarshaler) error
|
||||
}
|
||||
|
||||
type repo struct {
|
||||
s Storage
|
||||
s Storage
|
||||
release func() error
|
||||
}
|
||||
|
||||
func NewRepo(s Storage) (*repo, error) {
|
||||
@@ -44,3 +45,38 @@ func NewFileRepo(path string) (*repo, error) {
|
||||
}
|
||||
return NewRepo(s)
|
||||
}
|
||||
|
||||
func (r *repo) Lock() (err error) {
|
||||
if r.s == nil {
|
||||
return errors.New("storage is closed")
|
||||
}
|
||||
if r.release != nil {
|
||||
return errors.New("storage already locked")
|
||||
}
|
||||
r.release, err = r.s.Lock()
|
||||
if err != nil {
|
||||
r.close()
|
||||
return
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (r *repo) Release() (err error) {
|
||||
if r.s == nil {
|
||||
return errors.New("storage is closed")
|
||||
}
|
||||
if r.release == nil {
|
||||
return errors.New("storage was never locked")
|
||||
}
|
||||
err = r.release()
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
r.close()
|
||||
return nil
|
||||
}
|
||||
|
||||
func (r *repo) close() {
|
||||
r.release = nil
|
||||
r.s = nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user