Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.
 
 
 

114 lignes
2.8 KiB

  1. // Disabling building of toml support in cases where golang is 1.0 or 1.1
  2. // as the encoding library is not implemented or supported.
  3. // +build go1.2
  4. package altsrc
  5. import (
  6. "fmt"
  7. "reflect"
  8. "github.com/BurntSushi/toml"
  9. "gopkg.in/urfave/cli.v1"
  10. )
  11. type tomlMap struct {
  12. Map map[interface{}]interface{}
  13. }
  14. func unmarshalMap(i interface{}) (ret map[interface{}]interface{}, err error) {
  15. ret = make(map[interface{}]interface{})
  16. m := i.(map[string]interface{})
  17. for key, val := range m {
  18. v := reflect.ValueOf(val)
  19. switch v.Kind() {
  20. case reflect.Bool:
  21. ret[key] = val.(bool)
  22. case reflect.String:
  23. ret[key] = val.(string)
  24. case reflect.Int:
  25. ret[key] = int(val.(int))
  26. case reflect.Int8:
  27. ret[key] = int(val.(int8))
  28. case reflect.Int16:
  29. ret[key] = int(val.(int16))
  30. case reflect.Int32:
  31. ret[key] = int(val.(int32))
  32. case reflect.Int64:
  33. ret[key] = int(val.(int64))
  34. case reflect.Uint:
  35. ret[key] = int(val.(uint))
  36. case reflect.Uint8:
  37. ret[key] = int(val.(uint8))
  38. case reflect.Uint16:
  39. ret[key] = int(val.(uint16))
  40. case reflect.Uint32:
  41. ret[key] = int(val.(uint32))
  42. case reflect.Uint64:
  43. ret[key] = int(val.(uint64))
  44. case reflect.Float32:
  45. ret[key] = float64(val.(float32))
  46. case reflect.Float64:
  47. ret[key] = float64(val.(float64))
  48. case reflect.Map:
  49. if tmp, err := unmarshalMap(val); err == nil {
  50. ret[key] = tmp
  51. } else {
  52. return nil, err
  53. }
  54. case reflect.Array:
  55. fallthrough // [todo] - Support array type
  56. default:
  57. return nil, fmt.Errorf("Unsupported: type = %#v", v.Kind())
  58. }
  59. }
  60. return ret, nil
  61. }
  62. func (self *tomlMap) UnmarshalTOML(i interface{}) error {
  63. if tmp, err := unmarshalMap(i); err == nil {
  64. self.Map = tmp
  65. } else {
  66. return err
  67. }
  68. return nil
  69. }
  70. type tomlSourceContext struct {
  71. FilePath string
  72. }
  73. // NewTomlSourceFromFile creates a new TOML InputSourceContext from a filepath.
  74. func NewTomlSourceFromFile(file string) (InputSourceContext, error) {
  75. tsc := &tomlSourceContext{FilePath: file}
  76. var results tomlMap = tomlMap{}
  77. if err := readCommandToml(tsc.FilePath, &results); err != nil {
  78. return nil, fmt.Errorf("Unable to load TOML file '%s': inner error: \n'%v'", tsc.FilePath, err.Error())
  79. }
  80. return &MapInputSource{valueMap: results.Map}, nil
  81. }
  82. // NewTomlSourceFromFlagFunc creates a new TOML InputSourceContext from a provided flag name and source context.
  83. func NewTomlSourceFromFlagFunc(flagFileName string) func(context *cli.Context) (InputSourceContext, error) {
  84. return func(context *cli.Context) (InputSourceContext, error) {
  85. filePath := context.String(flagFileName)
  86. return NewTomlSourceFromFile(filePath)
  87. }
  88. }
  89. func readCommandToml(filePath string, container interface{}) (err error) {
  90. b, err := loadDataFrom(filePath)
  91. if err != nil {
  92. return err
  93. }
  94. err = toml.Unmarshal(b, container)
  95. if err != nil {
  96. return err
  97. }
  98. err = nil
  99. return
  100. }