github.com/Jeffail/benthos/v3@v3.65.0/internal/docs/json_schema.go (about) 1 package docs 2 3 // JSONSchema serializes a field spec into a JSON schema structure. 4 func (f FieldSpec) JSONSchema() interface{} { 5 spec := map[string]interface{}{} 6 switch f.Kind { 7 case Kind2DArray: 8 innerField := f 9 innerField.Kind = KindArray 10 spec["type"] = "array" 11 spec["items"] = innerField.JSONSchema() 12 case KindArray: 13 innerField := f 14 innerField.Kind = KindScalar 15 spec["type"] = "array" 16 spec["items"] = innerField.JSONSchema() 17 case KindMap: 18 innerField := f 19 innerField.Kind = KindScalar 20 spec["type"] = "object" 21 spec["patternProperties"] = map[string]interface{}{ 22 ".": innerField.JSONSchema(), 23 } 24 default: 25 switch f.Type { 26 case FieldTypeBool: 27 spec["type"] = "boolean" 28 case FieldTypeString: 29 spec["type"] = "string" 30 case FieldTypeInt: 31 spec["type"] = "number" 32 case FieldTypeFloat: 33 spec["type"] = "number" 34 case FieldTypeObject: 35 spec["type"] = "object" 36 spec["properties"] = f.Children.JSONSchema() 37 var required []string 38 for _, child := range f.Children { 39 if !child.IsOptional && child.Default == nil { 40 required = append(required, child.Name) 41 } 42 } 43 if len(required) > 0 { 44 spec["required"] = required 45 } 46 spec["additionalProperties"] = false 47 case FieldTypeInput: 48 spec["$ref"] = "#/$defs/input" 49 case FieldTypeBuffer: 50 spec["$ref"] = "#/$defs/buffer" 51 case FieldTypeCache: 52 spec["$ref"] = "#/$defs/cache" 53 case FieldTypeCondition: 54 return true 55 case FieldTypeProcessor: 56 spec["$ref"] = "#/$defs/processor" 57 case FieldTypeRateLimit: 58 spec["$ref"] = "#/$defs/rate_limit" 59 case FieldTypeOutput: 60 spec["$ref"] = "#/$defs/output" 61 case FieldTypeMetrics: 62 spec["$ref"] = "#/$defs/metrics" 63 case FieldTypeTracer: 64 spec["$ref"] = "#/$defs/tracer" 65 } 66 } 67 return spec 68 } 69 70 // JSONSchema serializes a field spec into a JSON schema structure. 71 func (f FieldSpecs) JSONSchema() map[string]interface{} { 72 spec := map[string]interface{}{} 73 for _, field := range f { 74 spec[field.Name] = field.JSONSchema() 75 } 76 return spec 77 }