Added support for decimal and bigint format schema rendering

Want big numbers? you got it. https://github.com/pb33f/wiretap/issues/93
This commit is contained in:
quobix
2024-04-30 21:21:48 -04:00
parent 2999542014
commit f636dc939b
2 changed files with 60 additions and 1 deletions

View File

@@ -24,6 +24,8 @@ const (
stringType = "string"
numberType = "number"
integerType = "integer"
bigIntType = "bigint"
decimalType = "decimal"
booleanType = "boolean"
objectType = "object"
arrayType = "array"
@@ -217,7 +219,10 @@ func (wr *SchemaRenderer) DiveIntoSchema(schema *base.Schema, key string, struct
}
// handle numbers
if slices.Contains(schema.Type, numberType) || slices.Contains(schema.Type, integerType) {
if slices.Contains(schema.Type, numberType) ||
slices.Contains(schema.Type, integerType) ||
slices.Contains(schema.Type, bigIntType) ||
slices.Contains(schema.Type, decimalType) {
if schema.Enum != nil && len(schema.Enum) > 0 {
enum := schema.Enum[rand.Int()%len(schema.Enum)]
@@ -238,6 +243,27 @@ func (wr *SchemaRenderer) DiveIntoSchema(schema *base.Schema, key string, struct
maximum = int64(*schema.Maximum)
}
if schema.Example != nil {
var example any
_ = schema.Example.Decode(&example)
structure[key] = example
return
}
if schema.Examples != nil {
if len(schema.Examples) > 0 {
renderedExamples := make([]any, len(schema.Examples))
for i, exmp := range schema.Examples {
if exmp != nil {
var ex any
_ = exmp.Decode(&ex)
renderedExamples[i] = fmt.Sprint(ex)
}
}
structure[key] = renderedExamples
return
}
}
switch schema.Format {
case floatType:
structure[key] = rand.Float32()
@@ -245,6 +271,10 @@ func (wr *SchemaRenderer) DiveIntoSchema(schema *base.Schema, key string, struct
structure[key] = rand.Float64()
case int32Type:
structure[key] = int(wr.RandomInt(minimum, maximum))
case bigIntType:
structure[key] = wr.RandomInt(minimum, maximum)
case decimalType:
structure[key] = wr.RandomFloat64()
default:
structure[key] = wr.RandomInt(minimum, maximum)
}

View File

@@ -1082,6 +1082,35 @@ properties:
assert.Equal(t, `{"args":{"arrParam":"test,test2","arrParamExploded":["1","2"]}}`, string(rendered))
}
// https://github.com/pb33f/wiretap/issues/93
func TestRenderSchema_NonStandard_Format(t *testing.T) {
testObject := `type: object
properties:
bigint:
type: integer
format: bigint
example: 8821239038968084
bigintStr:
type: string
format: bigint
example: "9223372036854775808"
decimal:
type: number
format: decimal
example: 3.141592653589793
decimalStr:
type: string
format: decimal
example: "3.14159265358979344719667586"`
compiled := getSchema([]byte(testObject))
schema := make(map[string]any)
wr := createSchemaRenderer()
wr.DiveIntoSchema(compiled, "pb33f", schema, 0)
rendered, _ := json.Marshal(schema["pb33f"])
assert.Equal(t, `{"bigint":8821239038968084,"bigintStr":"9223372036854775808","decimal":3.141592653589793,"decimalStr":"3.14159265358979344719667586"}`, string(rendered))
}
func TestCreateRendererUsingDefaultDictionary(t *testing.T) {
assert.NotNil(t, CreateRendererUsingDefaultDictionary())
}