Figure out decimal pattern

This commit is contained in:
Andrey Pokhilko
2022-02-21 15:03:32 +03:00
parent 5a4baa05ca
commit 16cefcc55e

View File

@@ -1,7 +1,9 @@
package oas package oas
import ( import (
"encoding/json"
"net/url" "net/url"
"regexp"
"strconv" "strconv"
"strings" "strings"
@@ -50,7 +52,7 @@ func (n *Node) getOrSet(path NodePath, existingPathObj *openapi.PathObj) (node *
} }
if node == nil { if node == nil {
node = n.searchInParams(paramObj, chunkIsGibberish) node = n.searchInParams(paramObj, pathChunk, chunkIsGibberish)
} }
// still no node found, should create it // still no node found, should create it
@@ -76,6 +78,10 @@ func (n *Node) getOrSet(path NodePath, existingPathObj *openapi.PathObj) (node *
if err != nil { if err != nil {
logger.Log.Warningf("Failed to add example to a parameter: %s", err) logger.Log.Warningf("Failed to add example to a parameter: %s", err)
} }
if len(*exmp) > 1 && node.pathParam.Schema.Pattern == nil { // is it enough to decide on 2 samples?
node.pathParam.Schema.Pattern = getPatternFromExamples(exmp)
}
} }
// TODO: eat up trailing slash, in a smart way: node.pathObj!=nil && path[1]=="" // TODO: eat up trailing slash, in a smart way: node.pathObj!=nil && path[1]==""
@@ -88,6 +94,34 @@ func (n *Node) getOrSet(path NodePath, existingPathObj *openapi.PathObj) (node *
return node return node
} }
func getPatternFromExamples(exmp *openapi.Examples) *openapi.Regexp {
allInts := true
for _, example := range *exmp {
exampleObj, err := example.ResolveExample(exampleResolver)
if err != nil {
continue
}
var value string
err = json.Unmarshal(exampleObj.Value, &value)
if err != nil {
logger.Log.Warningf("Failed decoding parameter example into string: %s", err)
continue
}
if _, err := strconv.Atoi(value); err != nil {
allInts = false
}
}
if allInts {
re := new(openapi.Regexp)
re.Regexp = regexp.MustCompile("\\d+")
return re
}
return nil
}
func (n *Node) createParam() *openapi.ParameterObj { func (n *Node) createParam() *openapi.ParameterObj {
name := "param" name := "param"
@@ -118,20 +152,25 @@ func (n *Node) createParam() *openapi.ParameterObj {
return newParam return newParam
} }
func (n *Node) searchInParams(paramObj *openapi.ParameterObj, chunkIsGibberish bool) *Node { func (n *Node) searchInParams(paramObj *openapi.ParameterObj, chunk string, chunkIsGibberish bool) *Node {
// look among params
if paramObj != nil || chunkIsGibberish { if paramObj != nil || chunkIsGibberish {
for _, subnode := range n.children { logger.Log.Debugf("")
if subnode.constant != nil { }
continue
}
// TODO: check the regex pattern of param? for exceptions etc // look among params
for _, subnode := range n.children {
if subnode.constant != nil {
continue
}
if paramObj != nil { if chunkIsGibberish {
// TODO: mergeParam(subnode.pathParam, paramObj) return subnode
return subnode } else if paramObj != nil {
} else { // TODO: mergeParam(subnode.pathParam, paramObj)
return subnode
} else if subnode.pathParam.Schema.Pattern != nil {
// TODO: and not in exceptions
if subnode.pathParam.Schema.Pattern.Match([]byte(chunk)) {
return subnode return subnode
} }
} }