59 lines
2.1 KiB
Go
59 lines
2.1 KiB
Go
package project
|
||
|
||
import (
|
||
"fmt"
|
||
"os"
|
||
"path/filepath"
|
||
"strings"
|
||
)
|
||
|
||
// lastPathFile — файл вне самой БД проекта, хранит путь к последнему
|
||
// открытому проекту. Не может жить внутри SQLite-файла проекта по
|
||
// очевидной причине: нужно знать путь ДО того, как что-либо открыто.
|
||
func lastPathFile() (string, error) {
|
||
home, err := os.UserHomeDir()
|
||
if err != nil {
|
||
return "", fmt.Errorf("не удалось определить домашнюю директорию: %w", err)
|
||
}
|
||
dir := filepath.Join(home, ".burterm")
|
||
if err := os.MkdirAll(dir, 0o700); err != nil {
|
||
return "", fmt.Errorf("не удалось создать %s: %w", dir, err)
|
||
}
|
||
return filepath.Join(dir, "last-project"), nil
|
||
}
|
||
|
||
// SaveLastPath запоминает path как последний открытый проект — вызывается
|
||
// после каждого успешного Open, чтобы при следующем запуске TUI мог его
|
||
// подхватить сам, без необходимости вводить путь заново.
|
||
func SaveLastPath(path string) error {
|
||
f, err := lastPathFile()
|
||
if err != nil {
|
||
return err
|
||
}
|
||
if err := os.WriteFile(f, []byte(path), 0o600); err != nil {
|
||
return fmt.Errorf("сохранение последнего пути проекта: %w", err)
|
||
}
|
||
return nil
|
||
}
|
||
|
||
// LoadLastPath возвращает путь последнего открытого проекта и false,
|
||
// если такого файла ещё нет (первый запуск, или проект ни разу не
|
||
// открывали) — это не ошибка.
|
||
func LoadLastPath() (string, bool, error) {
|
||
f, err := lastPathFile()
|
||
if err != nil {
|
||
return "", false, err
|
||
}
|
||
b, err := os.ReadFile(f)
|
||
if os.IsNotExist(err) {
|
||
return "", false, nil
|
||
}
|
||
if err != nil {
|
||
return "", false, fmt.Errorf("чтение последнего пути проекта: %w", err)
|
||
}
|
||
path := strings.TrimSpace(string(b))
|
||
if path == "" {
|
||
return "", false, nil
|
||
}
|
||
return path, true, nil
|
||
}
|