| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128 |
- 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)
- }
|