MCPcopy
hub / github.com/gofiber/fiber / analyseParameterPart

Method analyseParameterPart

path.go:362–465  ·  view source on GitHub ↗

analyseParameterPart find the parameter end and create the route segment

(pattern string, regexHandler any, customConstraints ...CustomConstraint)

Source from the content-addressed store, hash-verified

360
361// analyseParameterPart find the parameter end and create the route segment
362func (parser *routeParser) analyseParameterPart(pattern string, regexHandler any, customConstraints ...CustomConstraint) (int, *routeSegment) {
363 isWildCard := pattern[0] == wildcardParam
364 isPlusParam := pattern[0] == plusParam
365
366 paramEndPosition := 0
367 paramConstraintStartPosition := -1
368 paramConstraintEndPosition := -1
369
370 // handle wildcard end
371 if !isWildCard && !isPlusParam {
372 paramEndPosition = -1
373 search := pattern[1:]
374 for i := range search {
375 if paramConstraintStartPosition == -1 && search[i] == paramConstraintStart && (i == 0 || search[i-1] != escapeChar) {
376 paramConstraintStartPosition = i + 1
377 continue
378 }
379 if paramConstraintStartPosition != -1 && search[i] == paramConstraintEnd && (i == 0 || search[i-1] != escapeChar) {
380 paramConstraintEndPosition = i + 1
381 continue
382 }
383 if parameterEndChars[search[i]] {
384 if (paramConstraintStartPosition == -1 && paramConstraintEndPosition == -1) ||
385 (paramConstraintStartPosition != -1 && paramConstraintEndPosition != -1) {
386 paramEndPosition = i
387 break
388 }
389 }
390 }
391
392 switch {
393 case paramEndPosition == -1:
394 paramEndPosition = len(pattern) - 1
395 case bytes.IndexByte(parameterDelimiterChars, pattern[paramEndPosition+1]) == -1:
396 paramEndPosition++
397 default:
398 // do nothing
399 }
400 }
401
402 // cut params part
403 processedPart := pattern[0 : paramEndPosition+1]
404 n := paramEndPosition + 1
405 paramName := RemoveEscapeChar(GetTrimmedParam(processedPart))
406
407 // Check has constraint
408 var constraints []*Constraint
409
410 if hasConstraint := paramConstraintStartPosition != -1 && paramConstraintEndPosition != -1; hasConstraint {
411 constraintString := pattern[paramConstraintStartPosition+1 : paramConstraintEndPosition]
412 userConstraints := splitNonEscaped(constraintString, paramConstraintSeparator)
413 constraints = make([]*Constraint, 0, len(userConstraints))
414
415 for _, c := range userConstraints {
416 start := findNextNonEscapedCharPosition(c, paramConstraintDataStart)
417 end := strings.LastIndexByte(c, paramConstraintDataEnd)
418
419 var rawName string

Callers 1

parseRouteMethod · 0.95

Calls 7

RemoveEscapeCharFunction · 0.85
GetTrimmedParamFunction · 0.85
splitNonEscapedFunction · 0.85
findConstraintHandlerFunction · 0.85
resolveConstraintNameFunction · 0.85
newConstraintFunction · 0.85

Tested by

no test coverage detected