main.go 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. package main
  2. import (
  3. "fmt"
  4. "log"
  5. "os"
  6. "os/signal"
  7. "syscall"
  8. bk "github.com/ilfey/Go-Phone-Book/internal/app/book"
  9. ai "github.com/ilfey/Go-Phone-Book/internal/pkg/ansi"
  10. )
  11. const (
  12. FILE_NAME = "dirictories.csv"
  13. )
  14. func FindContact(pb *bk.PhoneBook) (int, *bk.Contact) {
  15. var indeces []int
  16. ok := bk.GetConfirm("Вы хотите найти запись по имени контакта? (Y/n) >>> ", true)
  17. if ok {
  18. username := bk.GetUsername(pb.Scanner)
  19. indeces = pb.FindByUsername(username)
  20. } else {
  21. phone := bk.GetPhone(pb.Scanner)
  22. indeces = pb.FindByPhone(phone)
  23. }
  24. if len(indeces) == 0 {
  25. ai.Errorln("Контакт не найден.")
  26. return -1, nil
  27. }
  28. return bk.GetContact(indeces, pb)
  29. }
  30. func main() {
  31. pb, err := bk.NewPhoneBook(FILE_NAME)
  32. if err != nil {
  33. log.Fatal(err)
  34. }
  35. pb.AddCommands([]*bk.Command{
  36. {
  37. Title: "print",
  38. Description: "Выводит список на печать.",
  39. Action: func(pb *bk.PhoneBook) error {
  40. bk.PrintlnContacts(pb.Contacts)
  41. return nil
  42. },
  43. },
  44. {
  45. Title: "create",
  46. Description: "Создает новую запись.",
  47. Action: func(pb *bk.PhoneBook) error {
  48. contact := &bk.Contact{}
  49. contact.Username = bk.GetUsername(pb.Scanner)
  50. fmt.Print("Введите телефон >>> ")
  51. contact.Phone = bk.GetString() // TODO: add validation
  52. pb.Contacts = append(pb.Contacts, contact)
  53. ai.Successln("Запись создана.")
  54. return nil
  55. },
  56. },
  57. {
  58. Title: "edit",
  59. Description: "Изменяет запись.",
  60. Action: func(pb *bk.PhoneBook) error {
  61. contactIndex, contact := FindContact(pb)
  62. if contactIndex < 0 {
  63. return nil
  64. }
  65. c := *contact
  66. for {
  67. bk.PrintlnContact(contact)
  68. fmt.Println("Введите новое имя. (Enter - не изменять)")
  69. username := bk.GetUsernameOrEmpty(pb.Scanner)
  70. if username != "" {
  71. c.Username = username
  72. }
  73. fmt.Println("Введите новый телефон (без знака \"+\"). (Enter - не изменять)")
  74. phone := bk.GetPhoneOrEmpty(pb.Scanner)
  75. if phone != "" {
  76. c.Phone = "+" + phone
  77. }
  78. if c.Username == contact.Username && c.Phone == contact.Phone {
  79. break
  80. }
  81. bk.PrintlnContact(&c)
  82. ok := bk.GetConfirm("Проверьте, все ли данные введены правильно. (Y/n) >>> ", true)
  83. if ok {
  84. pb.Contacts[contactIndex] = &c
  85. ai.Successln("Запись обновлена.")
  86. break
  87. }
  88. }
  89. return nil
  90. },
  91. },
  92. {
  93. Title: "delete",
  94. Description: "Удаляет запись.",
  95. Action: func(pb *bk.PhoneBook) error {
  96. contactIndex, contact := FindContact(pb)
  97. if contactIndex < 0 {
  98. return nil
  99. }
  100. bk.PrintlnContact(contact)
  101. ok := bk.GetConfirm("Вы действительно хотите удалить эту запись? (Y/n) >>> ", true)
  102. if ok {
  103. pb.Contacts[contactIndex] = pb.Contacts[len(pb.Contacts)-1]
  104. pb.Contacts[len(pb.Contacts)-1] = nil
  105. pb.Contacts = pb.Contacts[:len(pb.Contacts)-1]
  106. ai.Successln("Запись удалена.")
  107. }
  108. return nil
  109. },
  110. },
  111. {
  112. Title: "find",
  113. Description: "Поиск записи.",
  114. Action: func(pb *bk.PhoneBook) error {
  115. var indeces []int
  116. ok := bk.GetConfirm("Вы хотите найти запись по имени контакта? (Y/n) >>> ", true)
  117. if ok {
  118. username := bk.GetUsername(pb.Scanner)
  119. indeces = pb.FindByUsername(username)
  120. } else {
  121. phone := bk.GetPhone(pb.Scanner)
  122. indeces = pb.FindByPhone(phone)
  123. }
  124. if len(indeces) == 0 {
  125. ai.Errorln("Контакт не найден.")
  126. return nil
  127. }
  128. var contacts []*bk.Contact
  129. for _, i := range indeces {
  130. contacts = append(contacts, pb.Contacts[i])
  131. }
  132. bk.PrintlnContacts(contacts)
  133. return nil
  134. },
  135. },
  136. })
  137. signalChan := make(chan os.Signal)
  138. signal.Notify(signalChan, syscall.SIGINT)
  139. go func() {
  140. <-signalChan
  141. err := pb.SavePhoneBook()
  142. if err != nil {
  143. ai.Errorln("Данные не удалось сохранить. Приносим свои глубочайшие извинения.")
  144. } else {
  145. ai.Successln("Данные сохранены.")
  146. }
  147. os.Exit(0)
  148. }()
  149. err = pb.Run()
  150. if err != nil {
  151. log.Fatal(err)
  152. }
  153. }