converters.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. package redriver
  2. import (
  3. "fmt"
  4. "net/url"
  5. "strings"
  6. "github.com/aws/aws-sdk-go-v2/aws/arn"
  7. )
  8. func ARNFromURL(qURL string) (arn.ARN, error) {
  9. a := arn.ARN{}
  10. u, err := url.Parse(qURL)
  11. if err != nil {
  12. return a, fmt.Errorf("queue URL %q is not a valid URL: %w", qURL, err)
  13. }
  14. path := u.EscapedPath()
  15. pathParts := strings.Split(strings.Trim(path, "/"), "/")
  16. if len(pathParts) != 2 {
  17. return a, fmt.Errorf("queue path %q does not have exactly 2 parts", path)
  18. }
  19. hostParts := strings.Split(u.Host, ".")
  20. if len(hostParts) != 4 { // <service>.<region>.amazonws.com
  21. return a, fmt.Errorf("queue host %q does not have exactly 4 parts", u.Host)
  22. }
  23. a = arn.ARN{
  24. Partition: "aws",
  25. Service: hostParts[0],
  26. Region: hostParts[1],
  27. AccountID: pathParts[0],
  28. Resource: pathParts[1],
  29. }
  30. return a, nil
  31. }
  32. func NameFromURL(qURL string) (name string, err error) {
  33. u, err := url.Parse(qURL)
  34. if err != nil {
  35. return "", fmt.Errorf("queue URL %q is not a valid URL: %w", qURL, err)
  36. }
  37. path := u.EscapedPath()
  38. parts := strings.Split(strings.Trim(path, "/"), "/")
  39. if len(parts) != 2 {
  40. return "", fmt.Errorf("queue path %q does not have exactly 2 parts", path)
  41. }
  42. return parts[1], nil
  43. }
  44. func NameFromARN(qARN arn.ARN) string {
  45. return qARN.Resource
  46. }
  47. func NameFromARNString(qARN string) (name string, err error) {
  48. a, err := arn.Parse(qARN)
  49. if err != nil {
  50. return "", fmt.Errorf("queue \"ARN\" %q is not an valid ARN", qARN)
  51. }
  52. return NameFromARN(a), nil
  53. }
  54. func URLFromARNString(qARN string) (name string, err error) {
  55. a, err := arn.Parse(qARN)
  56. if err != nil {
  57. return "", fmt.Errorf("queue \"ARN\" %q is not an valid ARN", qARN)
  58. }
  59. return URLFromARN(a)
  60. }
  61. func URLFromARN(qARN arn.ARN) (name string, err error) {
  62. path, err := url.JoinPath("/", qARN.AccountID, qARN.Resource)
  63. if err != nil {
  64. return "", fmt.Errorf("incorrect queue ARN: %w", err)
  65. }
  66. u := url.URL{
  67. Scheme: "https",
  68. Host: fmt.Sprintf("%s.%s.%s", qARN.Service, qARN.Region, "amazonws.com"),
  69. Path: path,
  70. }
  71. return u.String(), nil
  72. }