package account import ( "encoding/json" "errors" "fmt" "math/rand/v2" "net/url" "time" "github.com/fatih/color" ) var letterRunes = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGIJKLMNOPQRSTUVWXYZ1234567890-*!?()#$%&") type Account struct { Login string `json:"login"` Password string `json:"password"` Url string `json:"url"` CreatedAt time.Time `json:"createdAt"` UpdatedAt time.Time `json:"updatedAt"` } // метод вывода пароля func (acc *Account) OutputPassword() { c := color.New(color.FgRed, color.Italic, color.Bold) c.Printf("password: %v\n", acc.Password) } func (acc *Account) ToBytes() ([]byte, error) { file, err := json.Marshal(acc) if err != nil { return nil, err } return file, nil } // метод генерации пароля func (acc *Account) generatePassword(n int) { res := make([]rune, n) for i := range res { res[i] = letterRunes[rand.IntN(len(letterRunes))] } acc.Password = string(res) } // Создание аккаунта с таймстамп func NewAccount(login, password, urlString string) (*Account, error) { _, err := url.ParseRequestURI(urlString) if err != nil { return nil, errors.New("INVALID_URL") } if login == "" { return nil, errors.New("INVALID_LOGIN") } newAcc := &Account{ CreatedAt: time.Now(), UpdatedAt: time.Now(), Login: login, Password: password, Url: urlString, } if password == "" { newAcc.generatePassword(18) } return newAcc, nil } // функция введения данных func PromptData(prompt string) string { fmt.Print(prompt) var res string fmt.Scanln(&res) return res }