adam-gui/vendor/fyne.io/fyne/v2/internal/docs.go

129 lines
2.8 KiB
Go
Raw Normal View History

2024-04-29 19:13:50 +02:00
package internal
import (
"errors"
"fyne.io/fyne/v2"
"fyne.io/fyne/v2/storage"
)
var errNoAppID = errors.New("storage API requires a unique ID, use app.NewWithID()")
// Docs is an internal implementation of the document features of the Storage interface.
// It is based on top of the current `file` repository and is rooted at RootDocURI.
type Docs struct {
RootDocURI fyne.URI
}
// Create will create a new document ready for writing, you must write something and close the returned writer
// for the create process to complete.
// If the document for this app with that name already exists a storage.ErrAlreadyExists error will be returned.
func (d *Docs) Create(name string) (fyne.URIWriteCloser, error) {
if d.RootDocURI == nil {
return nil, errNoAppID
}
err := d.ensureRootExists()
if err != nil {
return nil, err
}
u, err := storage.Child(d.RootDocURI, name)
if err != nil {
return nil, err
}
exists, err := storage.Exists(u)
if err != nil {
return nil, err
}
if exists {
return nil, storage.ErrAlreadyExists
}
return storage.Writer(u)
}
// List returns all documents that have been saved by the current application.
// Remember to use `app.NewWithID` so that your storage is unique.
func (d *Docs) List() []string {
if d.RootDocURI == nil {
return nil
}
uris, err := storage.List(d.RootDocURI)
if err != nil {
return nil
}
ret := make([]string, len(uris))
for i, u := range uris {
ret[i] = u.Name()
}
return ret
}
// Open will grant access to the contents of the named file. If an error occurs it is returned instead.
func (d *Docs) Open(name string) (fyne.URIReadCloser, error) {
if d.RootDocURI == nil {
return nil, errNoAppID
}
u, err := storage.Child(d.RootDocURI, name)
if err != nil {
return nil, err
}
return storage.Reader(u)
}
// Remove will delete the document with the specified name, if it exists
func (d *Docs) Remove(name string) error {
if d.RootDocURI == nil {
return errNoAppID
}
u, err := storage.Child(d.RootDocURI, name)
if err != nil {
return err
}
return storage.Delete(u)
}
// Save will open a document ready for writing, you close the returned writer for the save to complete.
// If the document for this app with that name does not exist a storage.ErrNotExists error will be returned.
func (d *Docs) Save(name string) (fyne.URIWriteCloser, error) {
if d.RootDocURI == nil {
return nil, errNoAppID
}
u, err := storage.Child(d.RootDocURI, name)
if err != nil {
return nil, err
}
exists, err := storage.Exists(u)
if err != nil {
return nil, err
}
if !exists {
return nil, storage.ErrNotExists
}
return storage.Writer(u)
}
func (d *Docs) ensureRootExists() error {
exists, err := storage.Exists(d.RootDocURI)
if err != nil {
return err
}
if exists {
return nil
}
return storage.CreateListable(d.RootDocURI)
}