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