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 }