func NewMethod()

in codegen/method.go [184:295]


func NewMethod(
	thriftFile string,
	funcSpec *compile.FunctionSpec,
	packageHelper *PackageHelper,
	wantAnnot bool,
	isEndpoint bool,
	thriftService string,
) (*MethodSpec, error) {
	var (
		err    error
		ok     bool
		ant    = packageHelper.annotationPrefix
		method = &MethodSpec{}
	)
	method.CompiledThriftSpec = funcSpec
	method.Name = funcSpec.MethodName()
	method.IsEndpoint = isEndpoint
	method.WantAnnot = wantAnnot
	method.ThriftService = thriftService
	method.annotations = annotations{
		HTTPMethod:      fmt.Sprintf(antHTTPMethod, ant),
		HTTPPath:        fmt.Sprintf(antHTTPPath, ant),
		HTTPStatus:      fmt.Sprintf(antHTTPStatus, ant),
		HTTPReqHeaders:  fmt.Sprintf(antHTTPReqHeaders, ant),
		HTTPResHeaders:  fmt.Sprintf(antHTTPResHeaders, ant),
		HTTPRef:         fmt.Sprintf(antHTTPRef, ant),
		Meta:            fmt.Sprintf(antMeta, ant),
		Handler:         fmt.Sprintf(antHandler, ant),
		HTTPReqDefBoxed: fmt.Sprintf(AntHTTPReqDefBoxed, ant),
		HTTPResNoBody:   fmt.Sprintf(antHTTPResNoBody, ant),
	}

	method.GenCodePkgName, err = packageHelper.TypePackageName(thriftFile)
	if err != nil {
		return nil, err
	}

	err = method.setResponseType(thriftFile, funcSpec.ResultSpec, packageHelper)
	if err != nil {
		return nil, err
	}

	err = method.setRequestType(thriftFile, funcSpec, packageHelper)
	if err != nil {
		return nil, err
	}

	err = method.setExceptions(thriftFile, isEndpoint, funcSpec.ResultSpec, packageHelper)
	if err != nil {
		return nil, err
	}

	method.ReqHeaders = headers(funcSpec.Annotations[method.annotations.HTTPReqHeaders])
	method.ResHeaders = headers(funcSpec.Annotations[method.annotations.HTTPResHeaders])

	if !wantAnnot {
		return method, nil
	}

	if method.HTTPMethod, ok = funcSpec.Annotations[method.annotations.HTTPMethod]; !ok {
		return nil, errors.Errorf("missing annotation '%s' for HTTP method", method.annotations.HTTPMethod)
	}

	method.EndpointName = funcSpec.Annotations[method.annotations.Handler]

	err = method.setOKStatusCode(funcSpec.Annotations[method.annotations.HTTPStatus])
	if err != nil {
		return nil, err
	}

	method.setValidStatusCodes()

	if method.RequestType != "" {
		hasNoBody := method.HTTPMethod == "GET"
		if method.IsEndpoint {
			err := method.setParseQueryParamStatements(funcSpec, packageHelper, hasNoBody)
			if err != nil {
				return nil, err
			}
		} else {
			err := method.setWriteQueryParamStatements(funcSpec, packageHelper, hasNoBody)
			if err != nil {
				return nil, err
			}
		}
	}

	var httpPath string
	if httpPath, ok = funcSpec.Annotations[method.annotations.HTTPPath]; !ok {
		return nil, errors.Errorf(
			"missing annotation '%s' for HTTP path", method.annotations.HTTPPath,
		)
	}
	method.setHTTPPath(httpPath, funcSpec)

	err = method.setRequestParamFields(funcSpec, packageHelper)
	if err != nil {
		return nil, err
	}

	err = method.setEndpointRequestHeaderFields(funcSpec, packageHelper)
	if err != nil {
		return nil, err
	}
	err = method.setClientRequestHeaderFields(funcSpec, packageHelper)
	if err != nil {
		return nil, err
	}
	method.setResponseHeaderFields(funcSpec)

	return method, nil
}