parser.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. package pacmanconf
  2. import (
  3. "fmt"
  4. "github.com/Morganamilo/go-pacmanconf/ini"
  5. "strconv"
  6. )
  7. type callbackData struct {
  8. conf *Config
  9. repo *Repository
  10. }
  11. func parseCallback(fileName string, line int, section string,
  12. key string, value string, data interface{}) error {
  13. if line < 0 {
  14. return fmt.Errorf("unable to read file: %s: %s", fileName, section)
  15. }
  16. d, ok := data.(*callbackData)
  17. if !ok {
  18. return fmt.Errorf("type assert failed when parsing: %s", fileName)
  19. }
  20. if key == "" && value == "" {
  21. if section == "options" {
  22. d.repo = nil
  23. } else {
  24. d.conf.Repos = append(d.conf.Repos, Repository{})
  25. d.repo = &d.conf.Repos[len(d.conf.Repos)-1]
  26. d.repo.Name = section
  27. }
  28. return nil
  29. }
  30. if section == "" {
  31. return fmt.Errorf("line %d is not in a section: %s", line, fileName)
  32. }
  33. if d.repo == nil {
  34. setOption(d.conf, key, value)
  35. } else {
  36. setRepo(d.repo, key, value)
  37. }
  38. return nil
  39. }
  40. func setRepo(repo *Repository, key string, value string) {
  41. switch key {
  42. case "Server":
  43. repo.Servers = append(repo.Servers, value)
  44. case "SigLevel":
  45. repo.SigLevel = append(repo.SigLevel, value)
  46. case "Usage":
  47. repo.Usage = append(repo.Usage, value)
  48. }
  49. }
  50. func setOption(conf *Config, key string, value string) {
  51. switch key {
  52. case "RootDir":
  53. conf.RootDir = value
  54. case "DBPath":
  55. conf.DBPath = value
  56. case "CacheDir":
  57. conf.CacheDir = append(conf.CacheDir, value)
  58. case "HookDir":
  59. conf.HookDir = append(conf.HookDir, value)
  60. case "GPGDir":
  61. conf.GPGDir = value
  62. case "LogFile":
  63. conf.LogFile = value
  64. case "HoldPkg":
  65. conf.HoldPkg = append(conf.HoldPkg, value)
  66. case "IgnorePkg":
  67. conf.IgnorePkg = append(conf.IgnorePkg, value)
  68. case "IgnoreGroup":
  69. conf.IgnoreGroup = append(conf.IgnoreGroup, value)
  70. case "Architecture":
  71. conf.Architecture = value
  72. case "XferCommand":
  73. conf.XferCommand = value
  74. case "NoUpgrade":
  75. conf.NoUpgrade = append(conf.NoUpgrade, value)
  76. case "NoExtract":
  77. conf.NoExtract = append(conf.NoExtract, value)
  78. case "CleanMethod":
  79. conf.CleanMethod = append(conf.CleanMethod, value)
  80. case "SigLevel":
  81. conf.SigLevel = append(conf.SigLevel, value)
  82. case "LocalFileSigLevel":
  83. conf.LocalFileSigLevel = append(conf.LocalFileSigLevel, value)
  84. case "RemoteFileSigLevel":
  85. conf.RemoteFileSigLevel = append(conf.RemoteFileSigLevel, value)
  86. case "UseSyslog":
  87. conf.UseSyslog = true
  88. case "Color":
  89. conf.Color = true
  90. case "UseDelta":
  91. f, err := strconv.ParseFloat(value, 64)
  92. if err == nil {
  93. conf.UseDelta = f
  94. }
  95. case "TotalDownload":
  96. conf.TotalDownload = true
  97. case "CheckSpace":
  98. conf.CheckSpace = true
  99. case "VerbosePkgLists":
  100. conf.VerbosePkgLists = true
  101. case "DisableDownloadTimeout":
  102. conf.DisableDownloadTimeout = true
  103. }
  104. }
  105. func Parse(iniData string) (*Config, error) {
  106. data := callbackData{&Config{}, nil}
  107. err := ini.Parse(iniData, parseCallback, &data)
  108. return data.conf, err
  109. }
  110. func PacmanConf(args ...string) (*Config, string, error) {
  111. stdout, stderr, err := pacmanconf(args)
  112. if err != nil {
  113. return nil, stderr, err
  114. }
  115. conf, err := Parse(stdout)
  116. return conf, "", err
  117. }
  118. func ParseFile(path string) (*Config, string, error) {
  119. return PacmanConf("--config", path)
  120. }