Unnest common schema initialization
This makes the common code path less deeply nested and the flow control easier to follow.
This commit is contained in:
parent
30461cc297
commit
444c38806d
@ -223,37 +223,38 @@ func Parse(dest interface{}, cacheStore *sync.Map, namer Namer) (*Schema, error)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if s, loaded := cacheStore.LoadOrStore(modelType, schema); !loaded {
|
if v, loaded := cacheStore.LoadOrStore(modelType, schema); loaded {
|
||||||
defer close(schema.initialized)
|
s := v.(*Schema)
|
||||||
if _, embedded := schema.cacheStore.Load(embeddedCacheKey); !embedded {
|
<-s.initialized
|
||||||
for _, field := range schema.Fields {
|
return s, s.err
|
||||||
if field.DataType == "" && (field.Creatable || field.Updatable || field.Readable) {
|
}
|
||||||
if schema.parseRelation(field); schema.err != nil {
|
|
||||||
return schema, schema.err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fieldValue := reflect.New(field.IndirectFieldType)
|
defer close(schema.initialized)
|
||||||
if fc, ok := fieldValue.Interface().(CreateClausesInterface); ok {
|
if _, embedded := schema.cacheStore.Load(embeddedCacheKey); !embedded {
|
||||||
field.Schema.CreateClauses = append(field.Schema.CreateClauses, fc.CreateClauses(field)...)
|
for _, field := range schema.Fields {
|
||||||
}
|
if field.DataType == "" && (field.Creatable || field.Updatable || field.Readable) {
|
||||||
|
if schema.parseRelation(field); schema.err != nil {
|
||||||
if fc, ok := fieldValue.Interface().(QueryClausesInterface); ok {
|
return schema, schema.err
|
||||||
field.Schema.QueryClauses = append(field.Schema.QueryClauses, fc.QueryClauses(field)...)
|
|
||||||
}
|
|
||||||
|
|
||||||
if fc, ok := fieldValue.Interface().(UpdateClausesInterface); ok {
|
|
||||||
field.Schema.UpdateClauses = append(field.Schema.UpdateClauses, fc.UpdateClauses(field)...)
|
|
||||||
}
|
|
||||||
|
|
||||||
if fc, ok := fieldValue.Interface().(DeleteClausesInterface); ok {
|
|
||||||
field.Schema.DeleteClauses = append(field.Schema.DeleteClauses, fc.DeleteClauses(field)...)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fieldValue := reflect.New(field.IndirectFieldType)
|
||||||
|
if fc, ok := fieldValue.Interface().(CreateClausesInterface); ok {
|
||||||
|
field.Schema.CreateClauses = append(field.Schema.CreateClauses, fc.CreateClauses(field)...)
|
||||||
|
}
|
||||||
|
|
||||||
|
if fc, ok := fieldValue.Interface().(QueryClausesInterface); ok {
|
||||||
|
field.Schema.QueryClauses = append(field.Schema.QueryClauses, fc.QueryClauses(field)...)
|
||||||
|
}
|
||||||
|
|
||||||
|
if fc, ok := fieldValue.Interface().(UpdateClausesInterface); ok {
|
||||||
|
field.Schema.UpdateClauses = append(field.Schema.UpdateClauses, fc.UpdateClauses(field)...)
|
||||||
|
}
|
||||||
|
|
||||||
|
if fc, ok := fieldValue.Interface().(DeleteClausesInterface); ok {
|
||||||
|
field.Schema.DeleteClauses = append(field.Schema.DeleteClauses, fc.DeleteClauses(field)...)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
schema = s.(*Schema)
|
|
||||||
<-schema.initialized
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return schema, schema.err
|
return schema, schema.err
|
||||||
|
Loading…
x
Reference in New Issue
Block a user