ente/internal/promt.go

145 lines
2.8 KiB
Go
Raw Normal View History

2023-09-23 10:45:10 +00:00
package internal
2023-09-13 12:58:15 +00:00
import (
"errors"
"fmt"
2023-10-21 09:26:13 +00:00
"github.com/ente-io/cli/internal/api"
2023-09-14 04:20:32 +00:00
"log"
2023-09-13 12:58:15 +00:00
"os"
"golang.org/x/term"
)
func GetSensitiveField(label string) (string, error) {
fmt.Printf("%s: ", label)
input, err := term.ReadPassword(int(os.Stdin.Fd()))
if err != nil {
return "", err
}
return string(input), nil
}
func GetUserInput(label string) (string, error) {
fmt.Printf("%s: ", label)
var input string
_, err := fmt.Scanln(&input)
if err != nil {
return "", err
}
if input == "" {
return "", errors.New("input cannot be empty")
}
return input, nil
}
2023-09-14 04:20:32 +00:00
func GetAppType() api.App {
for {
app, err := GetUserInput("Enter app type (default: photos)")
if err != nil {
fmt.Printf("Use default app type: %s\n", api.AppPhotos)
return api.AppPhotos
}
switch app {
case "photos":
return api.AppPhotos
case "auth":
return api.AppAuth
case "locker":
return api.AppLocker
case "":
return api.AppPhotos
default:
fmt.Println("invalid app type")
continue
}
}
}
2023-09-14 04:20:32 +00:00
func GetCode(promptText string, length int) (string, error) {
for {
ott, err := GetUserInput(promptText)
if err != nil {
return "", err
}
if ott == "" {
log.Fatal("no OTP entered")
return "", errors.New("no OTP entered")
}
if ott == "c" {
return "", errors.New("OTP entry cancelled")
}
if len(ott) != length {
fmt.Printf("OTP must be %d digits", length)
continue
}
return ott, nil
}
}
2023-10-16 18:18:00 +00:00
func GetExportDir() string {
for {
exportDir, err := GetUserInput("Enter export directory")
if err != nil {
return ""
}
if exportDir == "" {
fmt.Printf("invalid export directory: %s\n", err)
continue
}
exportDir, err = ResolvePath(exportDir)
if err != nil {
fmt.Printf("invalid export directory: %s\n", err)
continue
}
_, err = ValidateDirForWrite(exportDir)
if err != nil {
fmt.Printf("invalid export directory: %s\n", err)
continue
}
return exportDir
}
}
func ValidateDirForWrite(dir string) (bool, error) {
// Check if the path exists
fileInfo, err := os.Stat(dir)
if err != nil {
if os.IsNotExist(err) {
return false, fmt.Errorf("path does not exist: %s", dir)
}
return false, err
}
// Check if the path is a directory
if !fileInfo.IsDir() {
return false, fmt.Errorf("path is not a directory")
}
// Check for write permission
// Check for write permission by creating a temp file
tempFile, err := os.CreateTemp(dir, "write_test_")
if err != nil {
return false, fmt.Errorf("write permission denied: %v", err)
}
// Delete temp file
defer os.Remove(tempFile.Name())
if err != nil {
return false, err
}
return true, nil
}
func ResolvePath(path string) (string, error) {
if path[:2] != "~/" {
return path, nil
}
home, err := os.UserHomeDir()
if err != nil {
return "", err
}
return home + path[1:], nil
}