From 273e37102f40c4ede8da9f41ab77ea846752b2fd Mon Sep 17 00:00:00 2001 From: johnabass Date: Fri, 16 Jun 2023 15:17:28 -0700 Subject: [PATCH] added a basic tag builder as a compiler-friendly alternative to specifying tags in annotations --- tagBuilder.go | 73 ++++++++++++++++++++++++++++++++++++++++++++++ tagBuilder_test.go | 57 ++++++++++++++++++++++++++++++++++++ 2 files changed, 130 insertions(+) create mode 100644 tagBuilder.go create mode 100644 tagBuilder_test.go diff --git a/tagBuilder.go b/tagBuilder.go new file mode 100644 index 0000000..514c846 --- /dev/null +++ b/tagBuilder.go @@ -0,0 +1,73 @@ +package arrange + +import ( + "reflect" + "strings" + + "go.uber.org/fx" +) + +type TagBuilder struct { + tags []string +} + +func (tb *TagBuilder) Skip() *TagBuilder { + tb.tags = append(tb.tags, "") + return tb +} + +func (tb *TagBuilder) Optional() *TagBuilder { + tb.tags = append(tb.tags, `optional:"true"`) + return tb +} + +func (tb *TagBuilder) Name(v string) *TagBuilder { + var o strings.Builder + o.WriteString(`name:"`) + o.WriteString(v) + o.WriteRune('"') + tb.tags = append(tb.tags, o.String()) + + return tb +} + +func (tb *TagBuilder) OptionalName(v string) *TagBuilder { + var o strings.Builder + o.WriteString(`name:"`) + o.WriteString(v) + o.WriteString(`" optional:"true"`) + tb.tags = append(tb.tags, o.String()) + + return tb +} + +func (tb *TagBuilder) Group(v string) *TagBuilder { + var o strings.Builder + o.WriteString(`group:"`) + o.WriteString(v) + o.WriteRune('"') + tb.tags = append(tb.tags, o.String()) + + return tb +} + +func (tb *TagBuilder) StructTags() (tags []reflect.StructTag) { + tags = make([]reflect.StructTag, 0, len(tb.tags)) + for _, v := range tb.tags { + tags = append(tags, reflect.StructTag(v)) + } + + return +} + +func (tb *TagBuilder) ParamTags() fx.Annotation { + return fx.ParamTags(tb.tags...) +} + +func (tb *TagBuilder) ResultTags() fx.Annotation { + return fx.ResultTags(tb.tags...) +} + +func Tags() *TagBuilder { + return new(TagBuilder) +} diff --git a/tagBuilder_test.go b/tagBuilder_test.go new file mode 100644 index 0000000..cf15575 --- /dev/null +++ b/tagBuilder_test.go @@ -0,0 +1,57 @@ +package arrange + +import ( + "bytes" + "testing" + + "github.com/stretchr/testify/suite" + "go.uber.org/fx" + "go.uber.org/fx/fxtest" +) + +type TagBuilderSuite struct { + suite.Suite +} + +func (suite *TagBuilderSuite) TestParamTags() { + type parameters struct { + fx.Out + + Named string `name:"name"` + Values []string `group:"values"` + } + + var buffer *bytes.Buffer + app := fxtest.New( + suite.T(), + fx.Provide( + func() parameters { + return parameters{} // doesn't matter what the values are + }, + func() int { return 123 }, + fx.Annotate( + func( + name string, optional string, values []string, optionalUnnamed string, skipped int, + ) *bytes.Buffer { + return new(bytes.Buffer) // dummy component + }, + Tags(). + Name("name"). + OptionalName("optional"). + Group("values"). + Optional(). + Skip(). + ParamTags(), + ), + ), + fx.Populate(&buffer), // force the constructor to run + ) + + app.RequireStart() + app.RequireStop() + suite.NotNil(buffer) +} + +func TestTagBuilder(t *testing.T) { + suite.Run(t, new(TagBuilderSuite)) +}