mirror of
https://github.com/LukeHagar/libopenapi.git
synced 2025-12-06 20:47:49 +00:00
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:
@@ -24,6 +24,8 @@ const (
|
|||||||
stringType = "string"
|
stringType = "string"
|
||||||
numberType = "number"
|
numberType = "number"
|
||||||
integerType = "integer"
|
integerType = "integer"
|
||||||
|
bigIntType = "bigint"
|
||||||
|
decimalType = "decimal"
|
||||||
booleanType = "boolean"
|
booleanType = "boolean"
|
||||||
objectType = "object"
|
objectType = "object"
|
||||||
arrayType = "array"
|
arrayType = "array"
|
||||||
@@ -217,7 +219,10 @@ func (wr *SchemaRenderer) DiveIntoSchema(schema *base.Schema, key string, struct
|
|||||||
}
|
}
|
||||||
|
|
||||||
// handle numbers
|
// 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 {
|
if schema.Enum != nil && len(schema.Enum) > 0 {
|
||||||
enum := schema.Enum[rand.Int()%len(schema.Enum)]
|
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)
|
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 {
|
switch schema.Format {
|
||||||
case floatType:
|
case floatType:
|
||||||
structure[key] = rand.Float32()
|
structure[key] = rand.Float32()
|
||||||
@@ -245,6 +271,10 @@ func (wr *SchemaRenderer) DiveIntoSchema(schema *base.Schema, key string, struct
|
|||||||
structure[key] = rand.Float64()
|
structure[key] = rand.Float64()
|
||||||
case int32Type:
|
case int32Type:
|
||||||
structure[key] = int(wr.RandomInt(minimum, maximum))
|
structure[key] = int(wr.RandomInt(minimum, maximum))
|
||||||
|
case bigIntType:
|
||||||
|
structure[key] = wr.RandomInt(minimum, maximum)
|
||||||
|
case decimalType:
|
||||||
|
structure[key] = wr.RandomFloat64()
|
||||||
default:
|
default:
|
||||||
structure[key] = wr.RandomInt(minimum, maximum)
|
structure[key] = wr.RandomInt(minimum, maximum)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1082,6 +1082,35 @@ properties:
|
|||||||
assert.Equal(t, `{"args":{"arrParam":"test,test2","arrParamExploded":["1","2"]}}`, string(rendered))
|
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) {
|
func TestCreateRendererUsingDefaultDictionary(t *testing.T) {
|
||||||
assert.NotNil(t, CreateRendererUsingDefaultDictionary())
|
assert.NotNil(t, CreateRendererUsingDefaultDictionary())
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user