callbacks.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. package main
  2. import (
  3. "bufio"
  4. "fmt"
  5. "os"
  6. "strconv"
  7. alpm "github.com/jguer/go-alpm"
  8. )
  9. func questionCallback(question alpm.QuestionAny) {
  10. qi, err := question.QuestionInstallIgnorepkg()
  11. if err == nil {
  12. qi.SetInstall(true)
  13. }
  14. qp, err := question.QuestionSelectProvider()
  15. if err == nil {
  16. size := 0
  17. qp.Providers(alpmHandle).ForEach(func(pkg alpm.Package) error {
  18. size++
  19. return nil
  20. })
  21. fmt.Print(bold(cyan(":: ")))
  22. str := bold(fmt.Sprintf(bold("There are %d providers available for %s:"), size, qp.Dep()))
  23. size = 1
  24. var db string
  25. qp.Providers(alpmHandle).ForEach(func(pkg alpm.Package) error {
  26. thisDb := pkg.DB().Name()
  27. if db != thisDb {
  28. db = thisDb
  29. str += bold(cyan("\n:: ")) + bold("Repository "+db+"\n ")
  30. }
  31. str += fmt.Sprintf("%d) %s ", size, pkg.Name())
  32. size++
  33. return nil
  34. })
  35. fmt.Println(str)
  36. for {
  37. fmt.Print("\nEnter a number (default=1): ")
  38. if config.NoConfirm {
  39. fmt.Println()
  40. break
  41. }
  42. reader := bufio.NewReader(os.Stdin)
  43. numberBuf, overflow, err := reader.ReadLine()
  44. if err != nil {
  45. fmt.Println(err)
  46. break
  47. }
  48. if overflow {
  49. fmt.Println("Input too long")
  50. continue
  51. }
  52. if string(numberBuf) == "" {
  53. break
  54. }
  55. num, err := strconv.Atoi(string(numberBuf))
  56. if err != nil {
  57. fmt.Printf("%s invalid number: %s\n", red("error:"), string(numberBuf))
  58. continue
  59. }
  60. if num < 1 || num > size {
  61. fmt.Printf("%s invalid value: %d is not between %d and %d\n", red("error:"), num, 1, size)
  62. continue
  63. }
  64. qp.SetUseIndex(num - 1)
  65. break
  66. }
  67. }
  68. }