public CodeGenerationResult Generate(string jsonSchema, string jsonFileName, string targetNamespace)
        {
            if (string.IsNullOrEmpty(jsonSchema))
            {
                throw new ArgumentException("json schema was not provided", nameof(jsonSchema));
            }

            var rootname    = GetDefaultRootItemNameFromFileName(jsonFileName);
            var typeNameGen = new CustomTypeNameGenerator(rootname);
            var schema      = JsonSchema4.FromJson(jsonSchema);
            var generator   = new CSharpGenerator(schema, new CSharpGeneratorSettings()
            {
                Namespace = targetNamespace, ClassStyle = CSharpClassStyle.Poco, RequiredPropertiesMustBeDefined = false, TypeNameGenerator = typeNameGen, ArrayType = "List"
            });

            var result = new CodeGenerationResult {
                Code = generator.GenerateFile()
            };

            AddAssemblyVersionAttributes(result, targetNamespace);

            // this calling back to the TypeGenerator sure gives these a 'bas type/sub-type' kind of vibe.
            TypeGenerator.BuildGeneratedCode(result, rootname, CreateMetadataReferences());

            result.RootTypeName = typeNameGen.AssignedRootTypeName;

            return(result);
        }
        public CodeGenerationResult Generate(PhysicalSchema schema /* Maybe this should take a logical schema instead to help work out the root elements? */, string targetNamespace)
        {
            var code = CreateCodeNamespace(schema, targetNamespace);

            var provider = new Microsoft.CSharp.CSharpCodeProvider();

            var sb = new StringBuilder();

            using (StringWriter sw = new StringWriter(sb))
            {
                provider.CreateGenerator().GenerateCodeFromNamespace(code.Code, sw, new CodeGeneratorOptions());
            }

            var result = new CodeGenerationResult()
            {
                Code = sb.ToString()
            };

            TypeGenerator.BuildGeneratedCode(result, schema.Files[0].FileName /* TODO */, CreateMetadataReferences());
            result.RootTypeName = code.RootElementName;
            return(result);
        }