using Azure.Bicep.Types.Concrete;
using Azure.Bicep.Types.Az;
using Newtonsoft.Json.Linq;
using System.Runtime.CompilerServices;
public static void Main()
var loader = new AzTypeLoader();
var index = loader.LoadTypeIndex();
var allTypes = index.Resources;
var vm = loader.LoadResourceType(allTypes["Microsoft.KeyVault/managedHSMs@2023-07-01"]);
var vmProps = (vm.Body.Type as ObjectType).Properties;
Console.WriteLine(ToJsonSchemaRecursive(vm.Body.Type).ToString());
private static JObject ToJsonSchemaRecursive(TypeBase type)
RuntimeHelpers.EnsureSufficientExecutionStack();
case StringLiteralType _:
case ArrayType arrayType:
["items"] = ToJsonSchemaRecursive(arrayType.ItemType.Type)
case ObjectType objectType:
var writableProps = objectType.Properties.Where(x => !x.Value.Flags.HasFlag(ObjectTypePropertyFlags.ReadOnly));
var requiredProps = writableProps.Where(x => x.Value.Flags.HasFlag(ObjectTypePropertyFlags.Required));
var properties = writableProps.Select(x => new JProperty(x.Key, ToJsonSchemaRecursive(x.Value.Type.Type)));
["properties"] = new JObject(properties),
["required"] = new JArray(requiredProps.Select(x => x.Key)),
throw new NotImplementedException($"{type.GetType()}");