123 lines
2.9 KiB
Go
123 lines
2.9 KiB
Go
package main
|
||
|
||
import (
|
||
"fmt"
|
||
"password/account"
|
||
"password/encrypter"
|
||
"password/files"
|
||
"password/output"
|
||
"strings"
|
||
|
||
"github.com/fatih/color"
|
||
"github.com/joho/godotenv"
|
||
)
|
||
|
||
var menu = map[string]func(*account.VaultWithDb){
|
||
"1": createAccount,
|
||
"2": findAccountByUrl,
|
||
"3": findAccountByLogin,
|
||
"4": deleteAccount,
|
||
}
|
||
|
||
var menuVariants = []string{
|
||
"1. Создать аккаунт",
|
||
"2. Найти аккаунт по URL",
|
||
"3. Найти аккаунт по логину",
|
||
"4. Удалить аккаунт",
|
||
"5. Выход",
|
||
"Выберите вариант",
|
||
}
|
||
|
||
func menuCounter() func() {
|
||
i := 0
|
||
return func() {
|
||
i++
|
||
fmt.Println("Вызов:", i)
|
||
}
|
||
}
|
||
|
||
func main() {
|
||
color.Blue("__Менеджер паролей__")
|
||
// Load env file
|
||
err := godotenv.Load()
|
||
if err != nil {
|
||
output.PrintError("Не удалось найти файл .env")
|
||
}
|
||
vault := account.NewVault(files.NewJsonDb("data.vault"), *encrypter.NewEncrypter())
|
||
counter := menuCounter()
|
||
Menu:
|
||
for {
|
||
counter()
|
||
variant := PromptData(menuVariants...)
|
||
menuFunc := menu[variant]
|
||
if menuFunc == nil {
|
||
break Menu
|
||
}
|
||
menuFunc(vault)
|
||
}
|
||
}
|
||
|
||
func findAccountByUrl(vault *account.VaultWithDb) {
|
||
url := PromptData("Введите URL для поиска")
|
||
// Анонимная функция как параметр
|
||
accounts := vault.FindAccounts(url, func(acc account.Account, str string) bool {
|
||
return strings.Contains(acc.Url, str)
|
||
})
|
||
outputResults(&accounts)
|
||
}
|
||
|
||
func findAccountByLogin(vault *account.VaultWithDb) {
|
||
login := PromptData("Введите Login для поиска")
|
||
// Анонимная функция как параметр
|
||
accounts := vault.FindAccounts(login, func(acc account.Account, str string) bool {
|
||
return strings.Contains(acc.Login, str)
|
||
})
|
||
outputResults(&accounts)
|
||
}
|
||
|
||
func outputResults(accounts *[]account.Account) {
|
||
if len(*accounts) == 0 {
|
||
color.Red("Аккаунт не найден!")
|
||
}
|
||
for _, account := range *accounts {
|
||
account.Output()
|
||
}
|
||
}
|
||
|
||
func deleteAccount(vault *account.VaultWithDb) {
|
||
url := PromptData("Введите URL для поиска: ")
|
||
isDeleted := vault.DeleteAccountByUrl(url)
|
||
if isDeleted {
|
||
color.Green("Удалено")
|
||
} else {
|
||
output.PrintError("Не найдено")
|
||
}
|
||
}
|
||
|
||
func createAccount(vault *account.VaultWithDb) {
|
||
login := PromptData("Введите логин: ")
|
||
password := PromptData("Введите пароль: ")
|
||
url := PromptData("Введите URL: ")
|
||
|
||
myAccount, err := account.NewAccount(login, password, url)
|
||
if err != nil {
|
||
output.PrintError("ОШИБКА: Неверный формат URL или Login")
|
||
return
|
||
}
|
||
vault.AddAccount(*myAccount)
|
||
}
|
||
|
||
// функция введения данных
|
||
func PromptData(prompt ...string) string {
|
||
for i, line := range prompt {
|
||
if i == len(prompt)-1 {
|
||
fmt.Printf("%v: ", line)
|
||
} else {
|
||
fmt.Println(line)
|
||
}
|
||
}
|
||
var res string
|
||
fmt.Scanln(&res)
|
||
return res
|
||
}
|