#2 - add swaggerset

This commit is contained in:
Gorbunov Kirill Andreevich
2024-11-30 19:30:46 +03:00
parent fb1ae47d6f
commit e207117ba4
4 changed files with 49 additions and 64 deletions

View File

@@ -1,7 +1,6 @@
package swaggerset
import (
"encoding/json"
"fmt"
"reflect"
"strings"
@@ -10,24 +9,17 @@ import (
dynamicstruct "github.com/ompluscator/dynamic-struct"
)
type messages struct {
Msgs []message
type Message struct {
Type string
Request httpRequest
Response interface{}
}
func newMessages() *messages {
return &messages{
Msgs: make([]message, 0),
}
type httpRequest struct {
Header interface{}
Body interface{}
}
type message struct {
Type string
RequestParam interface{}
RequestBody interface{}
Response interface{}
}
// Обработка операции (GET или POST)
func handleOperation(method string, operation *openapi3.Operation) (reqParam, reqBody, rsp interface{}) {
fmt.Printf(" Method: %s\n", method)
@@ -37,23 +29,21 @@ func handleOperation(method string, operation *openapi3.Operation) (reqParam, re
for _, paramRef := range operation.Parameters {
param := paramRef.Value
fieldName := capitalize(param.Name)
jsonName := strings.ToLower(param.Name[:1]) + param.Name[1:]
goType := getGoType(param.Schema)
// В зависимости от того, где параметр находится (header, query, path, etc.), добавляем соответствующий тег
switch param.In {
case "query":
paramsStruct = paramsStruct.AddField(fieldName, goType, fmt.Sprintf(`json:"%s" query:"%s"`, param.Name, param.Name))
paramsStruct = paramsStruct.AddField(fieldName, goType, fmt.Sprintf(`json:"%s" query:"%s"`, jsonName, jsonName))
case "header":
paramsStruct = paramsStruct.AddField(fieldName, goType, fmt.Sprintf(`json:"%s" header:"%s"`, param.Name, param.Name))
paramsStruct = paramsStruct.AddField(fieldName, goType, fmt.Sprintf(`json:"%s" header:"%s"`, jsonName, jsonName))
default:
paramsStruct = paramsStruct.AddField(fieldName, goType, fmt.Sprintf(`json:"%s"`, param.Name))
paramsStruct = paramsStruct.AddField(fieldName, goType, fmt.Sprintf(`json:"%s"`, jsonName))
}
}
requestStruct := paramsStruct.Build().New()
fmt.Printf(" Request (Parameters): %+v\n", requestStruct)
buf, _ := json.Marshal(requestStruct)
fmt.Printf(" Request (Parameters) JSON: %s\n", buf)
reqParam = requestStruct
// Получили структуру запроса для методов, где есть параметры в header, query, path, etc., добавили теги
reqParam = paramsStruct.Build().New()
}
// Обработка тела запроса (POST)
@@ -62,9 +52,7 @@ func handleOperation(method string, operation *openapi3.Operation) (reqParam, re
bodyFields := buildDynamicStruct(content.Schema)
bodyStruct := reflect.StructOf(bodyFields)
bodyInstance := reflect.New(bodyStruct).Interface()
fmt.Printf(" Request (Body): %+v\n", bodyInstance)
buf, _ := json.Marshal(bodyInstance)
fmt.Printf(" Request (Body) JSON: %s\n", buf)
// Получили тело запроса
reqBody = bodyInstance
}
}
@@ -76,9 +64,7 @@ func handleOperation(method string, operation *openapi3.Operation) (reqParam, re
responseFields := buildDynamicStruct(content.Schema)
responseStruct := reflect.StructOf(responseFields)
responseInstance := reflect.New(responseStruct).Interface()
fmt.Printf(" Response: %+v\n", responseInstance)
buf, _ := json.Marshal(responseInstance)
fmt.Printf(" Response JSON: %s\n", buf)
// Получили структуру ответа
rsp = responseInstance
}
}
@@ -88,11 +74,10 @@ func handleOperation(method string, operation *openapi3.Operation) (reqParam, re
// Рекурсивное создание структуры из схемы с учетом $ref
func buildDynamicStruct(schema *openapi3.SchemaRef) []reflect.StructField {
var builder []reflect.StructField
fmt.Println("ref: ", schema.Ref)
var sfields []reflect.StructField
if len(schema.Value.Properties) == 0 {
return builder
return sfields
}
for name, prop := range schema.Value.Properties {
@@ -106,7 +91,7 @@ func buildDynamicStruct(schema *openapi3.SchemaRef) []reflect.StructField {
Tag: reflect.StructTag(fmt.Sprintf(`json:"%s"`, name)),
}
builder = append(builder, sfield)
sfields = append(sfields, sfield)
} else {
sfield := reflect.StructField{
Name: fieldName,
@@ -114,11 +99,11 @@ func buildDynamicStruct(schema *openapi3.SchemaRef) []reflect.StructField {
Tag: reflect.StructTag(fmt.Sprintf(`json:"%s"`, name)),
}
builder = append(builder, sfield)
sfields = append(sfields, sfield)
}
}
return builder
return sfields
}
// Преобразование типа OpenAPI в тип Go
@@ -152,7 +137,7 @@ func capitalize(fieldName string) string {
// Обрабатываем каждый фрагмент
for i := 0; i < len(parts); i++ {
// Капитализируем первые буквы всех частей, кроме первой
parts[i] = strings.Title(parts[i])
parts[i] = strings.Title(parts[i]) //cases.Title(language.English).String(parts[i])
}
// Собираем строку обратно, соединяя части без подчеркиваний