Guest User

Untitled

a guest
Nov 4th, 2024
120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 3.47 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4.     "bufio"
  5.     "flag"
  6.     "fmt"
  7.     "os"
  8.     "strconv"
  9.     "strings"
  10. )
  11.  
  12. const (
  13.     configFileName = "config.txt"
  14.     minGridSize    = 1
  15.     maxGridSize    = 100
  16.     minPercent     = 0
  17.     maxPercent     = 100
  18. )
  19.  
  20. type Config struct {
  21.     Width   int
  22.     Height  int
  23.     Percent int
  24. }
  25.  
  26. func (c *Config) String() string {
  27.     return fmt.Sprintf("%dx%d %d%%", c.Width, c.Height, c.Percent)
  28. }
  29.  
  30. func parseIntInput(prompt string, min, max int) (int, error) {
  31.     for {
  32.         fmt.Print(prompt)
  33.         reader := bufio.NewReader(os.Stdin)
  34.         input, _ := reader.ReadString('\n')
  35.         input = strings.TrimSpace(input)
  36.  
  37.         value, err := strconv.Atoi(input)
  38.         if err != nil {
  39.             fmt.Printf("Ошибка: введите целое число.\n")
  40.             continue
  41.         }
  42.  
  43.         if value < min || value > max {
  44.             fmt.Printf("Ошибка: значение должно быть между %d и %d.\n", min, max)
  45.             continue
  46.         }
  47.  
  48.         return value, nil
  49.     }
  50. }
  51.  
  52. func getConfigInteractively() (*Config, error) {
  53.     width, err := parseIntInput(fmt.Sprintf("Введите ширину сетки (%d-%d): ", minGridSize, maxGridSize), minGridSize, maxGridSize)
  54.     if err != nil {
  55.         return nil, err
  56.     }
  57.  
  58.     height, err := parseIntInput(fmt.Sprintf("Введите высоту сетки (%d-%d): ", minGridSize, maxGridSize), minGridSize, maxGridSize)
  59.     if err != nil {
  60.         return nil, err
  61.     }
  62.  
  63.     percent, err := parseIntInput(fmt.Sprintf("Введите процент заполнения (%d-%d): ", minPercent, maxPercent), minPercent, maxPercent)
  64.     if err != nil {
  65.         return nil, err
  66.     }
  67.  
  68.     return &Config{Width: width, Height: height, Percent: percent}, nil
  69. }
  70.  
  71. func saveConfig(config *Config) error {
  72.     err := os.WriteFile(configFileName, []byte(config.String()), 0644)
  73.     if err != nil {
  74.         return fmt.Errorf("ошибка при записи в файл %s: %v", configFileName, err)
  75.     }
  76.     return nil
  77. }
  78.  
  79. func run() error {
  80.     var interactive bool
  81.     var width, height, percent int
  82.  
  83.     flag.BoolVar(&interactive, "i", false, "Использовать интерактивный режим")
  84.     flag.IntVar(&width, "w", 0, fmt.Sprintf("Ширина сетки (%d-%d)", minGridSize, maxGridSize))
  85.     flag.IntVar(&height, "h", 0, fmt.Sprintf("Высота сетки (%d-%d)", minGridSize, maxGridSize))
  86.     flag.IntVar(&percent, "p", 0, fmt.Sprintf("Процент заполнения (%d-%d)", minPercent, maxPercent))
  87.     flag.Parse()
  88.  
  89.     var config *Config
  90.     var err error
  91.  
  92.     if interactive {
  93.         config, err = getConfigInteractively()
  94.     } else {
  95.         if width == 0 || height == 0 || percent == 0 {
  96.             flag.Usage()
  97.             return fmt.Errorf("все параметры должны быть указаны в неинтерактивном режиме")
  98.         }
  99.         config = &Config{Width: width, Height: height, Percent: percent}
  100.     }
  101.  
  102.     if err != nil {
  103.         return err
  104.     }
  105.  
  106.     if err := saveConfig(config); err != nil {
  107.         return err
  108.     }
  109.  
  110.     fmt.Printf("Конфигурация успешно записана в файл %s\n", configFileName)
  111.     fmt.Printf("Содержимое: %s\n", config)
  112.     return nil
  113. }
  114.  
  115. func main() {
  116.     if err := run(); err != nil {
  117.         fmt.Fprintf(os.Stderr, "Ошибка: %v\n", err)
  118.         os.Exit(1)
  119.     }
  120. }
Advertisement
Add Comment
Please, Sign In to add comment