97 lines
2.6 KiB
Go
97 lines
2.6 KiB
Go
package storage
|
|
|
|
import (
|
|
"encoding/json"
|
|
"errors"
|
|
"fmt"
|
|
"os"
|
|
)
|
|
|
|
type LocalDriver struct{}
|
|
|
|
func getLocalStoragePath() string {
|
|
homeDir, err := os.UserHomeDir()
|
|
applicationName := "/Textualize"
|
|
|
|
if err != nil {
|
|
return ""
|
|
}
|
|
|
|
return homeDir + applicationName
|
|
}
|
|
|
|
// `relativeSubdirectoryPath` should start and end with a `/`.
|
|
//
|
|
// Use empty string if you wish to just use the Application directory
|
|
func createLocalStorageSubDirIfNeeded(relativeSubdirectoryPath string) bool {
|
|
localStoragePath := getLocalStoragePath()
|
|
if localStoragePath == "" {
|
|
return false
|
|
}
|
|
|
|
fullLocalStoragePath := localStoragePath + relativeSubdirectoryPath
|
|
|
|
_, directoryError := os.Stat(fullLocalStoragePath)
|
|
directoryDoesNotExist := os.IsNotExist(directoryError)
|
|
if !directoryDoesNotExist {
|
|
return true
|
|
}
|
|
|
|
errorCreatingDir := os.MkdirAll(fullLocalStoragePath, os.ModePerm)
|
|
return errorCreatingDir == nil
|
|
}
|
|
|
|
// `relativePathInAppDir` should both start and end with a `/`
|
|
//
|
|
// `fileName` should not start with a `/` to avoid bad pathing
|
|
func WriteDataToAppDir(data []byte, relativePathInAppDir string, fileName string) error {
|
|
localStoragePath := getLocalStoragePath()
|
|
|
|
if localStoragePath == "" {
|
|
return errors.New("could not find application directory")
|
|
}
|
|
|
|
isLocalStorageDirectoryCreated := createLocalStorageSubDirIfNeeded(relativePathInAppDir)
|
|
if !isLocalStorageDirectoryCreated {
|
|
return errors.New("could not create subdirectory '" + localStoragePath + "' in application directory")
|
|
}
|
|
|
|
err := os.WriteFile(localStoragePath+relativePathInAppDir+fileName, data, 0644)
|
|
return err
|
|
}
|
|
|
|
// `relativePathInAppDir` should both start with a `/` and end with the file name
|
|
func ReadDataFromAppDir(relativePathInAppDir string) ([]byte, error) {
|
|
localStoragePath := getLocalStoragePath()
|
|
|
|
if localStoragePath == "" {
|
|
return make([]byte, 0), errors.New("could not find application directory")
|
|
}
|
|
|
|
data, err := os.ReadFile((localStoragePath + relativePathInAppDir))
|
|
if err != nil {
|
|
return make([]byte, 0), err
|
|
}
|
|
|
|
return data, nil
|
|
}
|
|
|
|
// `relativePathInAppDir` should both start with a `/` and end with the file name
|
|
func AssignFileDataToStruct(relativePathInAppDir string, structPointer interface{}) error {
|
|
fileData, err := ReadDataFromAppDir(relativePathInAppDir)
|
|
if err != nil {
|
|
fmt.Println("ReadDataFromAppDir err: " + err.Error())
|
|
return err
|
|
}
|
|
|
|
// response := structInterface
|
|
errorUnmarshaling := json.Unmarshal([]byte(fileData), structPointer)
|
|
if errorUnmarshaling != nil {
|
|
fmt.Println("errorUnmarshaling err: " + errorUnmarshaling.Error())
|
|
|
|
return errorUnmarshaling
|
|
}
|
|
|
|
return nil
|
|
}
|