demo.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. package main
  2. import (
  3. "context"
  4. "flag"
  5. "fmt"
  6. "io"
  7. "log"
  8. "os"
  9. "github.com/aws/aws-sdk-go-v2/config"
  10. "github.com/aws/aws-sdk-go-v2/service/sqs"
  11. "github.com/fgm/izidic"
  12. )
  13. func main() {
  14. main2(os.Stdout, os.Args[0], os.Args[1:])
  15. }
  16. func main2(w io.Writer, name string, args []string) {
  17. ctx := context.Background()
  18. dic := resolve(w, name, args)
  19. lister := dic.MustService("lister").(func(ctx context.Context) string)
  20. receiver := dic.MustService("receiver").(func(ctx context.Context, qName string))
  21. qName := lister(ctx)
  22. receiver(ctx, qName)
  23. }
  24. func resolve(w io.Writer, name string, args []string) *izidic.Container {
  25. dic := izidic.New()
  26. dic.Store("name", name)
  27. dic.Store("args", args)
  28. dic.Store("writer", w)
  29. dic.Register("flags", flagsService)
  30. dic.Register("logger", loggerService)
  31. dic.Register("sqs", sqsClientService)
  32. dic.Register("lister", listerService)
  33. dic.Register("receiver", receiverService)
  34. dic.MustService("flags") // Store generated params before freeze.
  35. dic.Freeze()
  36. return dic
  37. }
  38. func flagsService(dic *izidic.Container) (any, error) {
  39. fs := flag.NewFlagSet(dic.MustParam("name").(string), flag.ContinueOnError)
  40. profile := fs.String("profile", "test-profile", "The AWS profile")
  41. region := fs.String("region", "eu-west-3", "The AWS region to connect to")
  42. qName := fs.String("queue-name", "dummy-queue", "The queue name")
  43. sqsURL := fs.String("url", "http://localhost:4566", "The SQS endpoint URL")
  44. if err := fs.Parse(dic.MustParam("args").([]string)); err != nil {
  45. return nil, fmt.Errorf("cannot obtain CLI args")
  46. }
  47. dic.Store("profile", *profile)
  48. dic.Store("region", *region)
  49. dic.Store("url", *sqsURL)
  50. dic.Store("queue-name", *qName)
  51. return fs, nil
  52. }
  53. // loggerService is an izidic.Service also containing a one-time initialization action.
  54. func loggerService(dic *izidic.Container) (any, error) {
  55. w := dic.MustParam("writer").(io.Writer)
  56. log.SetOutput(w) // Support dependency code not taking an injected logger.
  57. logger := log.New(w, "", log.LstdFlags)
  58. return logger, nil
  59. }
  60. func sqsClientService(dic *izidic.Container) (any, error) {
  61. ctx := context.Background()
  62. profile := dic.MustParam("profile").(string)
  63. region := dic.MustParam("region").(string)
  64. epr := endpointResolver{region: region}
  65. cfg, err := config.LoadDefaultConfig(ctx,
  66. config.WithRegion(region),
  67. config.WithSharedConfigProfile(profile),
  68. config.WithEndpointResolverWithOptions(epr),
  69. )
  70. if err != nil {
  71. return nil, fmt.Errorf("failed loading default AWS config: %w", err)
  72. }
  73. client := sqs.NewFromConfig(cfg)
  74. return client, nil
  75. }
  76. func listerService(dic *izidic.Container) (any, error) {
  77. cli := dic.MustService("sqs").(*sqs.Client)
  78. w := dic.MustParam("writer").(io.Writer)
  79. return func(ctx context.Context) string {
  80. return lister(ctx, w, cli)
  81. }, nil
  82. }
  83. func receiverService(dic *izidic.Container) (any, error) {
  84. cli := dic.MustService("sqs").(*sqs.Client)
  85. w := dic.MustParam("writer").(io.Writer)
  86. return func(ctx context.Context, qName string) {
  87. receiver(ctx, w, cli, qName)
  88. }, nil
  89. }