func GetModelInfoFromLocalSpecFile()

in coverage/from_local_spec.go [42:115]


func GetModelInfoFromLocalSpecFile(resourceId, swaggerPath string, method string) (*SwaggerModel, error) {
	doc, err := loadSwagger(swaggerPath)
	if err != nil {
		return nil, err
	}

	paths := doc.Spec().Paths
	if paths == nil {
		return nil, fmt.Errorf("paths is nil, swagger path: %v", swaggerPath)
	}

	for pathKey, pathItem := range paths.Paths {
		if !IsPathKeyMatchWithResourceId(pathKey, resourceId) {
			continue
		}

		var operation *openapispec.Operation
		switch strings.ToUpper(method) {
		case "GET":
			operation = pathItem.Get
		case "PUT":
			operation = pathItem.Put
		case "POST":
			operation = pathItem.Post
		case "DELETE":
			operation = pathItem.Delete
		case "OPTIONS":
			operation = pathItem.Options
		case "HEAD":
			operation = pathItem.Head
		case "PATCH":
			operation = pathItem.Patch
		default:
			logrus.Warnf("unsupported method %v", method)
		}
		if operation == nil {
			// should not happen
			logrus.Warnf("no PUT operation found for path %v", pathKey)
			continue
		}

		var modelName string
		for _, param := range operation.Parameters {
			paramRef := param.Ref
			if paramRef.String() != "" {
				refParam, err := openapispec.ResolveParameterWithBase(nil, param.Ref, &openapispec.ExpandOptions{RelativeBase: swaggerPath})
				if err != nil {
					return nil, fmt.Errorf("resolve param ref %q: %+v", param.Ref.String(), err)
				}

				// Update the param
				param = *refParam
			}
			if param.In == "body" {
				if paramRef.String() != "" {
					modelName, swaggerPath = SchemaNamePathFromRef(swaggerPath, paramRef)
				}

				if param.Schema.Ref.String() != "" {
					modelName, swaggerPath = SchemaNamePathFromRef(swaggerPath, param.Schema.Ref)
				}
				break
			}
		}

		return &SwaggerModel{
			ApiPath:     pathKey,
			ModelName:   modelName,
			SwaggerPath: swaggerPath,
			OperationID: operation.ID,
		}, nil
	}
	return nil, nil
}