in code/Tools/Developer/AddXMsEnumToSwaggerJson/Program.cs [52:173]
private static void AddXMsEnumToSwaggerJson(string inputfileName, string outputFilename)
{
// read the JSON file
string jsonText = File.ReadAllText(inputfileName);
// parse it
dynamic jsonObj = JsonConvert.DeserializeObject(jsonText);
foreach (var objSection in jsonObj)
{
// handle class definitions; these define request/response data structures which may contain enums that need to be processed
if (objSection.Name == "definitions")
{
foreach (var objClass in objSection.Value)
{
foreach (var objDescription in objClass.Value)
{
if (objDescription.Name == "properties")
{
foreach (var objField in objDescription)
{
foreach (var objFieldDescription in objField)
{
string fieldName = objFieldDescription.Name;
bool isEnum = false;
bool hasXMSEnumProperty = false;
foreach (var objFieldProperties in objFieldDescription)
{
foreach (var objFieldProperty in objFieldProperties)
{
if (objFieldProperty.Name == "enum")
{
isEnum = true;
}
else if (objFieldProperty.Name == "x-ms-enum")
{
hasXMSEnumProperty = true;
}
}
if (isEnum && !hasXMSEnumProperty)
{
// insert new x-ms-enum property
var msEnum1 = new JProperty("name", fieldName);
var msEnum2 = new JObject();
msEnum2.Add(msEnum1);
var msEnum3 = new JProperty("x-ms-enum", msEnum2);
objFieldProperties.Add(msEnum3);
}
}
}
}
}
}
}
}
// handle API definitions; there might be enums lurking in the route path that need to be processed
else if (objSection.Name == "paths")
{
// this is every API call
foreach (var objCall in objSection.Value)
{
// this is every HTTP operation on the API call
foreach (var objOperation in objCall.Value)
{
// this is the tag or summary or description, etc.
foreach (var objPropertyBag in objOperation)
{
foreach (var objProperty in objPropertyBag)
{
if (objProperty.Name == "parameters")
{
foreach (var objParameter in objProperty)
{
// unnecessary nesting in swagger JSON
foreach (var objParameter2 in objParameter)
{
string fieldName = string.Empty;
bool isEnum = false;
bool hasXMSEnumProperty = false;
// read all the appropriate properties of this parameter
foreach (var objParameterProperty in objParameter2)
{
if (objParameterProperty.Name == "name")
{
fieldName = objParameterProperty.Value;
}
else if (objParameterProperty.Name == "enum")
{
isEnum = true;
}
else if (objParameterProperty.Name == "x-ms-enum")
{
hasXMSEnumProperty = true;
}
}
// do we need to insert x-ms-enum?
if (isEnum && !hasXMSEnumProperty)
{
// insert new x-ms-enum property
var msEnum1 = new JProperty("name", fieldName);
var msEnum2 = new JObject();
msEnum2.Add(msEnum1);
var msEnum3 = new JProperty("x-ms-enum", msEnum2);
objParameter2.Add(msEnum3);
}
}
}
}
}
}
}
}
}
}
// output
string output = JsonConvert.SerializeObject(jsonObj, Formatting.Indented);
File.WriteAllText(outputFilename, output);
}