mirror of
https://github.com/datarhei/core.git
synced 2025-10-05 16:07:07 +08:00

Commits (Ingo Oppermann): - Add experimental SRT connection stats and logs - Hide /config/reload endpoint in reade-only mode - Add SRT server - Create v16 in go.mod - Fix data races, tests, lint, and update dependencies - Add trailing slash for routed directories (datarhei/restreamer#340) - Allow relative URLs in content in static routes Co-Authored-By: Ingo Oppermann <57445+ioppermann@users.noreply.github.com>
110 lines
2.7 KiB
Go
110 lines
2.7 KiB
Go
//go:build go1.18
|
|
// +build go1.18
|
|
|
|
package swag
|
|
|
|
import (
|
|
"go/ast"
|
|
"strings"
|
|
)
|
|
|
|
func typeSpecFullName(typeSpecDef *TypeSpecDef) string {
|
|
fullName := typeSpecDef.FullName()
|
|
|
|
if typeSpecDef.TypeSpec.TypeParams != nil {
|
|
fullName = fullName + "["
|
|
for i, typeParam := range typeSpecDef.TypeSpec.TypeParams.List {
|
|
if i > 0 {
|
|
fullName = fullName + "-"
|
|
}
|
|
|
|
fullName = fullName + typeParam.Names[0].Name
|
|
}
|
|
fullName = fullName + "]"
|
|
}
|
|
|
|
return fullName
|
|
}
|
|
|
|
func (pkgDefs *PackagesDefinitions) parametrizeStruct(original *TypeSpecDef, fullGenericForm string) *TypeSpecDef {
|
|
genericParams := strings.Split(strings.TrimRight(fullGenericForm, "]"), "[")
|
|
if len(genericParams) == 1 {
|
|
return nil
|
|
}
|
|
|
|
genericParams = strings.Split(genericParams[1], ",")
|
|
for i, p := range genericParams {
|
|
genericParams[i] = strings.TrimSpace(p)
|
|
}
|
|
genericParamTypeDefs := map[string]*TypeSpecDef{}
|
|
|
|
if len(genericParams) != len(original.TypeSpec.TypeParams.List) {
|
|
return nil
|
|
}
|
|
|
|
for i, genericParam := range genericParams {
|
|
tdef, ok := pkgDefs.uniqueDefinitions[genericParam]
|
|
if !ok {
|
|
return nil
|
|
}
|
|
|
|
genericParamTypeDefs[original.TypeSpec.TypeParams.List[i].Names[0].Name] = tdef
|
|
}
|
|
|
|
parametrizedTypeSpec := &TypeSpecDef{
|
|
File: original.File,
|
|
PkgPath: original.PkgPath,
|
|
TypeSpec: &ast.TypeSpec{
|
|
Doc: original.TypeSpec.Doc,
|
|
Comment: original.TypeSpec.Comment,
|
|
Assign: original.TypeSpec.Assign,
|
|
},
|
|
}
|
|
|
|
ident := &ast.Ident{
|
|
NamePos: original.TypeSpec.Name.NamePos,
|
|
Obj: original.TypeSpec.Name.Obj,
|
|
}
|
|
|
|
genNameParts := strings.Split(fullGenericForm, "[")
|
|
if strings.Contains(genNameParts[0], ".") {
|
|
genNameParts[0] = strings.Split(genNameParts[0], ".")[1]
|
|
}
|
|
|
|
ident.Name = genNameParts[0] + "-" + strings.Replace(strings.Join(genericParams, "-"), ".", "_", -1)
|
|
ident.Name = strings.Replace(strings.Replace(ident.Name, "\t", "", -1), " ", "", -1)
|
|
|
|
parametrizedTypeSpec.TypeSpec.Name = ident
|
|
|
|
origStructType := original.TypeSpec.Type.(*ast.StructType)
|
|
|
|
newStructTypeDef := &ast.StructType{
|
|
Struct: origStructType.Struct,
|
|
Incomplete: origStructType.Incomplete,
|
|
Fields: &ast.FieldList{
|
|
Opening: origStructType.Fields.Opening,
|
|
Closing: origStructType.Fields.Closing,
|
|
},
|
|
}
|
|
|
|
for _, field := range origStructType.Fields.List {
|
|
newField := &ast.Field{
|
|
Doc: field.Doc,
|
|
Names: field.Names,
|
|
Tag: field.Tag,
|
|
Comment: field.Comment,
|
|
}
|
|
if genTypeSpec, ok := genericParamTypeDefs[field.Type.(*ast.Ident).Name]; ok {
|
|
newField.Type = genTypeSpec.TypeSpec.Type
|
|
} else {
|
|
newField.Type = field.Type
|
|
}
|
|
|
|
newStructTypeDef.Fields.List = append(newStructTypeDef.Fields.List, newField)
|
|
}
|
|
|
|
parametrizedTypeSpec.TypeSpec.Type = newStructTypeDef
|
|
|
|
return parametrizedTypeSpec
|
|
}
|