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  }