Skip to content

Commit

Permalink
Generate builders for reference to structs
Browse files Browse the repository at this point in the history
  • Loading branch information
K-Phoen committed Oct 7, 2023
1 parent a229675 commit 31a3a6f
Show file tree
Hide file tree
Showing 4 changed files with 45 additions and 10 deletions.
32 changes: 26 additions & 6 deletions internal/ast/builder.go
Original file line number Diff line number Diff line change
Expand Up @@ -63,31 +63,51 @@ type Assignment struct {
type BuilderGenerator struct {
}

func (generator *BuilderGenerator) FromAST(schemas []*Schema) []Builder {
func (generator *BuilderGenerator) FromAST(schemas Schemas) []Builder {
builders := make([]Builder, 0, len(schemas))

for _, schema := range schemas {
for _, object := range schema.Objects {
// we only want builders for structs
if object.Type.Kind != KindStruct {
// we only want builders for structs or references to structs
if object.Type.Kind == KindRef {
ref := object.Type.AsRef()
referredObj, found := schemas.LocateObject(ref.ReferredPkg, ref.ReferredType)
if !found {
continue
}

if referredObj.Type.Kind != KindStruct {
continue
}
}

if object.Type.Kind != KindStruct && object.Type.Kind != KindRef {
continue
}

builders = append(builders, generator.structObjectToBuilder(schema, object))
builders = append(builders, generator.structObjectToBuilder(schemas, schema, object))
}
}

return builders
}

func (generator *BuilderGenerator) structObjectToBuilder(schema *Schema, object Object) Builder {
func (generator *BuilderGenerator) structObjectToBuilder(schemas Schemas, schema *Schema, object Object) Builder {
builder := Builder{
RootPackage: schema.Package,
Package: object.Name,
Schema: schema,
For: object,
}
structType := object.Type.AsStruct()

var structType StructType
if object.Type.Kind == KindStruct {
structType = object.Type.AsStruct()
} else {
ref := object.Type.AsRef()
referredObj, _ := schemas.LocateObject(ref.ReferredPkg, ref.ReferredType)
structType = referredObj.Type.AsStruct()
}

for _, field := range structType.Fields {
if generator.fieldHasStaticValue(field) {
Expand Down
4 changes: 2 additions & 2 deletions internal/ast/compiler/disjunctions.go
Original file line number Diff line number Diff line change
Expand Up @@ -289,7 +289,7 @@ func (pass *DisjunctionToType) inferDiscriminatorField(schema *ast.Schema, def a
for _, branch := range def.Branches {
// FIXME: what if the definition is itself a reference? Resolve recursively?
typeName := branch.AsRef().ReferredType
structType := schema.LocateDefinition(typeName).Type.AsStruct()
structType := schema.LocateObject(typeName).Type.AsStruct()
candidates[typeName] = make(map[string]any)

for _, field := range structType.Fields {
Expand Down Expand Up @@ -343,7 +343,7 @@ func (pass *DisjunctionToType) buildDiscriminatorMapping(schema *ast.Schema, def
for _, branch := range def.Branches {
// FIXME: what if the definition is itself a reference? Resolve recursively?
typeName := branch.AsRef().ReferredType
structType := schema.LocateDefinition(typeName).Type.AsStruct()
structType := schema.LocateObject(typeName).Type.AsStruct()

field, found := structType.FieldByName(def.Discriminator)
if !found {
Expand Down
17 changes: 16 additions & 1 deletion internal/ast/schema.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,21 @@ const (

type Schemas []*Schema

func (schemas Schemas) LocateObject(pkg string, name string) (Object, bool) {
for _, schema := range schemas {
if schema.Package != pkg {
continue
}

obj := schema.LocateObject(name)

// TODO: schema.LocateObject() should return a "found" boolean
return obj, obj.Name != ""
}

return Object{}, false
}

func (schemas Schemas) DeepCopy() []*Schema {
newSchemas := make([]*Schema, 0, len(schemas))

Expand Down Expand Up @@ -46,7 +61,7 @@ func (schema *Schema) DeepCopy() Schema {
return newSchema
}

func (schema *Schema) LocateDefinition(name string) Object {
func (schema *Schema) LocateObject(name string) Object {
for _, def := range schema.Objects {
if def.Name == name {
return def
Expand Down
2 changes: 1 addition & 1 deletion internal/veneers/option/actions.go
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ func StructFieldsAsArgumentsAction(explicitFields ...string) RewriteAction {

firstArgType := option.Args[0].Type
if firstArgType.Kind == ast.KindRef {
referredObject := builder.Schema.LocateDefinition(firstArgType.AsRef().ReferredType)
referredObject := builder.Schema.LocateObject(firstArgType.AsRef().ReferredType)
firstArgType = referredObject.Type
}

Expand Down

0 comments on commit 31a3a6f

Please sign in to comment.