in src/Microsoft.OpenApi.OData.Reader/Generator/OpenApiEdmTypeSchemaGenerator.cs [138:400]
public static OpenApiSchema CreateSchema(this ODataContext context, IEdmPrimitiveType primitiveType)
{
Utils.CheckArgumentNull(context, nameof(context));
Utils.CheckArgumentNull(primitiveType, nameof(primitiveType));
// Spec has different configure for double, AnyOf or OneOf?
OpenApiSchema schema = new OpenApiSchema
{
AllOf = null,
OneOf = null,
AnyOf = null
};
switch (primitiveType.PrimitiveKind)
{
case EdmPrimitiveTypeKind.Binary: // binary
schema.Type = "string";
schema.Format = "base64url";
break;
case EdmPrimitiveTypeKind.Boolean: // boolean
schema.Type = "boolean";
schema.Default = new OpenApiBoolean(false);
break;
case EdmPrimitiveTypeKind.Byte: // byte
schema.Type = "integer";
schema.Format = "uint8";
break;
case EdmPrimitiveTypeKind.DateTimeOffset: // datetime offset
schema.Type = "string";
schema.Format = "date-time";
schema.Pattern = "^[0-9]{4,}-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])T([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]([.][0-9]{1,12})?(Z|[+-][0-9][0-9]:[0-9][0-9])$";
break;
case EdmPrimitiveTypeKind.Decimal: // decimal
if (context.Settings.IEEE754Compatible)
{
schema.AnyOf = new List<OpenApiSchema>
{
new OpenApiSchema { Type = "number" },
new OpenApiSchema { Type = "string" },
};
}
else
{
schema.Type = "number";
}
schema.Format = "decimal";
break;
case EdmPrimitiveTypeKind.Double: // double
schema.AnyOf = new List<OpenApiSchema>
{
new OpenApiSchema { Type = "number" },
new OpenApiSchema { Type = "string" },
new OpenApiSchema
{
Enum = new List<IOpenApiAny>
{
new OpenApiString("-INF"),
new OpenApiString("INF"),
new OpenApiString("NaN")
}
}
};
schema.Format = "double";
break;
case EdmPrimitiveTypeKind.Single: // single
schema.AnyOf = new List<OpenApiSchema>
{
new OpenApiSchema { Type = "number" },
new OpenApiSchema { Type = "string" },
new OpenApiSchema
{
Enum = new List<IOpenApiAny>
{
new OpenApiString("-INF"),
new OpenApiString("INF"),
new OpenApiString("NaN")
}
}
};
schema.Format = "float";
break;
case EdmPrimitiveTypeKind.Guid: // guid
schema.Type = "string";
schema.Format = "uuid";
schema.Pattern = "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$";
break;
case EdmPrimitiveTypeKind.Int16:
schema.Type = "integer";
schema.Format = "int16";
schema.Minimum = Int16.MinValue; // -32768
schema.Maximum = Int16.MaxValue; // 32767
break;
case EdmPrimitiveTypeKind.Int32:
schema.Type = "integer";
schema.Format = "int32";
schema.Minimum = Int32.MinValue; // -2147483648
schema.Maximum = Int32.MaxValue; // 2147483647
break;
case EdmPrimitiveTypeKind.Int64:
if (context.Settings.IEEE754Compatible)
{
schema.AnyOf = new List<OpenApiSchema>
{
new OpenApiSchema { Type = "integer" },
new OpenApiSchema { Type = "string" }
};
}
else
{
schema.Type = "integer";
}
schema.Format = "int64";
break;
case EdmPrimitiveTypeKind.SByte:
schema.Type = "integer";
schema.Format = "int8";
schema.Minimum = SByte.MinValue; // -128
schema.Maximum = SByte.MaxValue; // 127
break;
case EdmPrimitiveTypeKind.String: // string
schema.Type = "string";
break;
case EdmPrimitiveTypeKind.Stream: // stream
schema.Type = "string";
schema.Format = "base64url";
break;
case EdmPrimitiveTypeKind.Duration: // duration
schema.Type = "string";
schema.Format = "duration";
schema.Pattern = "^-?P([0-9]+D)?(T([0-9]+H)?([0-9]+M)?([0-9]+([.][0-9]+)?S)?)?$";
break;
case EdmPrimitiveTypeKind.Date:
schema.Type = "string";
schema.Format = "date";
schema.Pattern = "^[0-9]{4,}-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])$";
break;
case EdmPrimitiveTypeKind.TimeOfDay:
schema.Type = "string";
schema.Format = "time";
schema.Pattern = "^([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]([.][0-9]{1,12})?$";
break;
case EdmPrimitiveTypeKind.Geography:
schema.Reference = new OpenApiReference
{
Type = ReferenceType.Schema,
Id = "Edm.Geography"
};
break;
case EdmPrimitiveTypeKind.GeographyPoint:
schema.Reference = new OpenApiReference
{
Type = ReferenceType.Schema,
Id = "Edm.GeographyPoint"
};
break;
case EdmPrimitiveTypeKind.GeographyLineString:
schema.Reference = new OpenApiReference
{
Type = ReferenceType.Schema,
Id = "Edm.GeographyLineString"
};
break;
case EdmPrimitiveTypeKind.GeographyPolygon:
schema.Reference = new OpenApiReference
{
Type = ReferenceType.Schema,
Id = "Edm.GeographyPolygon"
};
break;
case EdmPrimitiveTypeKind.GeographyCollection:
schema.Reference = new OpenApiReference
{
Type = ReferenceType.Schema,
Id = "Edm.GeographyCollection"
};
break;
case EdmPrimitiveTypeKind.GeographyMultiPolygon:
schema.Reference = new OpenApiReference
{
Type = ReferenceType.Schema,
Id = "Edm.GeographyMultiPolygon"
};
break;
case EdmPrimitiveTypeKind.GeographyMultiLineString:
schema.Reference = new OpenApiReference
{
Type = ReferenceType.Schema,
Id = "Edm.GeographyMultiLineString"
};
break;
case EdmPrimitiveTypeKind.GeographyMultiPoint:
schema.Reference = new OpenApiReference
{
Type = ReferenceType.Schema,
Id = "Edm.GeographyMultiPoint"
};
break;
case EdmPrimitiveTypeKind.Geometry: // Geometry
schema.Reference = new OpenApiReference
{
Type = ReferenceType.Schema,
Id = "Edm.Geometry"
};
break;
case EdmPrimitiveTypeKind.GeometryPoint:
schema.Reference = new OpenApiReference
{
Type = ReferenceType.Schema,
Id = "Edm.GeometryPoint"
};
break;
case EdmPrimitiveTypeKind.GeometryLineString:
schema.Reference = new OpenApiReference
{
Type = ReferenceType.Schema,
Id = "Edm.GeometryLineString"
};
break;
case EdmPrimitiveTypeKind.GeometryPolygon:
schema.Reference = new OpenApiReference
{
Type = ReferenceType.Schema,
Id = "Edm.GeometryPolygon"
};
break;
case EdmPrimitiveTypeKind.GeometryCollection:
schema.Reference = new OpenApiReference
{
Type = ReferenceType.Schema,
Id = "Edm.GeometryCollection"
};
break;
case EdmPrimitiveTypeKind.GeometryMultiPolygon:
schema.Reference = new OpenApiReference
{
Type = ReferenceType.Schema,
Id = "Edm.GeometryMultiPolygon"
};
break;
case EdmPrimitiveTypeKind.GeometryMultiLineString:
schema.Reference = new OpenApiReference
{
Type = ReferenceType.Schema,
Id = "Edm.GeometryMultiLineString"
};
break;
case EdmPrimitiveTypeKind.GeometryMultiPoint:
schema.Reference = new OpenApiReference
{
Type = ReferenceType.Schema,
Id = "Edm.GeometryMultiPoint"
};
break;
case EdmPrimitiveTypeKind.None:
default:
throw new OpenApiException(String.Format(SRResource.NotSupportedEdmTypeKind, primitiveType.PrimitiveKind));
}
return schema;
}