Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package main
- import (
- "bufio"
- "flag"
- "fmt"
- "os"
- "strconv"
- "strings"
- )
- const (
- configFileName = "config.txt"
- minGridSize = 1
- maxGridSize = 100
- minPercent = 0
- maxPercent = 100
- )
- type Config struct {
- Width int
- Height int
- Percent int
- }
- func (c *Config) String() string {
- return fmt.Sprintf("%dx%d %d%%", c.Width, c.Height, c.Percent)
- }
- func parseIntInput(prompt string, min, max int) (int, error) {
- for {
- fmt.Print(prompt)
- reader := bufio.NewReader(os.Stdin)
- input, _ := reader.ReadString('\n')
- input = strings.TrimSpace(input)
- value, err := strconv.Atoi(input)
- if err != nil {
- fmt.Printf("Ошибка: введите целое число.\n")
- continue
- }
- if value < min || value > max {
- fmt.Printf("Ошибка: значение должно быть между %d и %d.\n", min, max)
- continue
- }
- return value, nil
- }
- }
- func getConfigInteractively() (*Config, error) {
- width, err := parseIntInput(fmt.Sprintf("Введите ширину сетки (%d-%d): ", minGridSize, maxGridSize), minGridSize, maxGridSize)
- if err != nil {
- return nil, err
- }
- height, err := parseIntInput(fmt.Sprintf("Введите высоту сетки (%d-%d): ", minGridSize, maxGridSize), minGridSize, maxGridSize)
- if err != nil {
- return nil, err
- }
- percent, err := parseIntInput(fmt.Sprintf("Введите процент заполнения (%d-%d): ", minPercent, maxPercent), minPercent, maxPercent)
- if err != nil {
- return nil, err
- }
- return &Config{Width: width, Height: height, Percent: percent}, nil
- }
- func saveConfig(config *Config) error {
- err := os.WriteFile(configFileName, []byte(config.String()), 0644)
- if err != nil {
- return fmt.Errorf("ошибка при записи в файл %s: %v", configFileName, err)
- }
- return nil
- }
- func run() error {
- var interactive bool
- var width, height, percent int
- flag.BoolVar(&interactive, "i", false, "Использовать интерактивный режим")
- flag.IntVar(&width, "w", 0, fmt.Sprintf("Ширина сетки (%d-%d)", minGridSize, maxGridSize))
- flag.IntVar(&height, "h", 0, fmt.Sprintf("Высота сетки (%d-%d)", minGridSize, maxGridSize))
- flag.IntVar(&percent, "p", 0, fmt.Sprintf("Процент заполнения (%d-%d)", minPercent, maxPercent))
- flag.Parse()
- var config *Config
- var err error
- if interactive {
- config, err = getConfigInteractively()
- } else {
- if width == 0 || height == 0 || percent == 0 {
- flag.Usage()
- return fmt.Errorf("все параметры должны быть указаны в неинтерактивном режиме")
- }
- config = &Config{Width: width, Height: height, Percent: percent}
- }
- if err != nil {
- return err
- }
- if err := saveConfig(config); err != nil {
- return err
- }
- fmt.Printf("Конфигурация успешно записана в файл %s\n", configFileName)
- fmt.Printf("Содержимое: %s\n", config)
- return nil
- }
- func main() {
- if err := run(); err != nil {
- fmt.Fprintf(os.Stderr, "Ошибка: %v\n", err)
- os.Exit(1)
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment