random_string_driver.go 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. package preview
  2. import (
  3. "math/rand"
  4. "time"
  5. "github.com/mitchellh/mapstructure"
  6. "github.com/porter-dev/switchboard/pkg/drivers"
  7. "github.com/porter-dev/switchboard/pkg/models"
  8. )
  9. const charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
  10. var seededRand *rand.Rand = rand.New(rand.NewSource(time.Now().UnixNano()))
  11. type RandomStringDriverConfig struct {
  12. Length uint
  13. }
  14. type RandomStringDriver struct {
  15. output map[string]interface{}
  16. config *RandomStringDriverConfig
  17. }
  18. func NewRandomStringDriver(resource *models.Resource, opts *drivers.SharedDriverOpts) (drivers.Driver, error) {
  19. driver := &RandomStringDriver{
  20. output: make(map[string]interface{}),
  21. }
  22. driverConfig := &RandomStringDriverConfig{}
  23. err := mapstructure.Decode(resource.Config, driverConfig)
  24. if err != nil {
  25. return nil, err
  26. }
  27. if driverConfig.Length == 0 {
  28. driverConfig.Length = 8
  29. }
  30. driver.config = driverConfig
  31. return driver, nil
  32. }
  33. func (d *RandomStringDriver) ShouldApply(resource *models.Resource) bool {
  34. return true
  35. }
  36. func (d *RandomStringDriver) Apply(resource *models.Resource) (*models.Resource, error) {
  37. d.output["value"] = randomString(d.config.Length)
  38. return resource, nil
  39. }
  40. func (d *RandomStringDriver) Output() (map[string]interface{}, error) {
  41. return d.output, nil
  42. }
  43. func randomString(length uint) string {
  44. b := make([]byte, length)
  45. for i := range b {
  46. b[i] = charset[seededRand.Intn(len(charset))]
  47. }
  48. return string(b)
  49. }