random_string_driver.go 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. package preview
  2. import (
  3. "crypto/rand"
  4. "github.com/mitchellh/mapstructure"
  5. "github.com/porter-dev/switchboard/pkg/drivers"
  6. "github.com/porter-dev/switchboard/pkg/models"
  7. )
  8. const defaultCharset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
  9. const lowerCharset = "abcdefghijklmnopqrstuvwxyz"
  10. type RandomStringDriverConfig struct {
  11. Length int
  12. Lower bool
  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. useCharset := defaultCharset
  38. if d.config.Lower {
  39. useCharset = lowerCharset
  40. }
  41. d.output["value"] = randomString(d.config.Length, useCharset)
  42. return resource, nil
  43. }
  44. func (d *RandomStringDriver) Output() (map[string]interface{}, error) {
  45. return d.output, nil
  46. }
  47. func randomString(length int, charset string) string {
  48. ll := len(charset)
  49. b := make([]byte, length)
  50. rand.Read(b) // generates len(b) random bytes
  51. for i := 0; i < length; i++ {
  52. b[i] = charset[int(b[i])%ll]
  53. }
  54. return string(b)
  55. }