package main import ( "fmt" "os" "password/account" "password/files" "password/output" "strings" "github.com/fatih/color" ) 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("__Менеджер паролей__") res := os.Getenv("PWD") fmt.Println(res) vault := account.NewVault(files.NewJsonDb("data.json")) 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 }