Ejemplo n.º 1
0
        private void GenerateCodeFromInternalPart(CodeBuilder codeBuilder, IJSBPart referencedPart, IdentifierString key, JSBRef jsonSchemaBuilderUriReference)
        {
            GenerateComments(codeBuilder, key, jsonSchemaBuilderUriReference);

            codeBuilder
            .L($"[JsonProperty(\"{TransformToCamelCase(key)}\")]")
            .L($"public {MakeCorrectItemType(referencedPart)} {TransformToTitleCase(key)} {{ get; set; }}{GenerateDefaultIfExisting(key, jsonSchemaBuilderUriReference)}")
            .EmptyLine();
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Generates comments for the parts that need it
        /// </summary>
        /// <param name="codeBuilder"></param>
        /// <param name="key"></param>
        /// <param name="jsonSchemaBuilderPart"></param>
        private void GenerateComments(CodeBuilder codeBuilder, IdentifierString key, IJSBPart jsonSchemaBuilderPart)
        {
            List <string> commentLines = GenerateCommentLines(key, jsonSchemaBuilderPart.Description, minSplitLength: 70, maxSplitLength: 90);

            codeBuilder.L("/// <summary>");
            foreach (string commentLine in commentLines)
            {
                codeBuilder.L($"/// {commentLine}");
            }
            codeBuilder.L("/// </summary>");
        }
Ejemplo n.º 3
0
        public static JSBSchema BuildSchema(JsonSchema jsonSchema)
        {
            if (jsonSchema.Equals(JsonSchema.Empty))
            {
                return(new JSBSchema("NoValidation", "Represents an empty schema with disabled validation"));
            }

            IJSBPart topPart = null;

            //TODO build from the schema

            JSBSchema jsonSchemaBuilderSchema = new JSBSchema(jsonSchema.Id, jsonSchema.Description(), topPart);

            return(jsonSchemaBuilderSchema);
        }
Ejemplo n.º 4
0
 public JSBSchema(IdentifierString schemaName, string description,
                  IJSBPart topPart          = null,
                  List <IJSBPart> defs      = null, JsonValue defaultValue = null,
                  List <JsonValue> examples = null, List <JsonValue> enums = null, bool isRequired = false)
     : base(schemaName, description, isRequired, defaultValue, examples, enums)
 {
     TopPart = topPart;
     if (defs != null)
     {
         foreach (IJSBPart part in defs)
         {
             Definitions.Add(part.Name, part);
         }
     }
 }
Ejemplo n.º 5
0
        private void DoReferenceResolution(IJSBPart jsonSchemaBuilderPart, NamespaceString module)
        {
            switch (jsonSchemaBuilderPart.PartType)
            {
            case JSBPartType.IriReference:
                JSBRef jsonSchemaBuilderIriReference = jsonSchemaBuilderPart as JSBRef;
                if (!jsonSchemaBuilderIriReference.IsFragmentOnly)
                {
                    string relativeLocalFileWithExpandedDot = jsonSchemaBuilderIriReference.RelativeLocalFile;
                    if (relativeLocalFileWithExpandedDot.StartsWith("./") || relativeLocalFileWithExpandedDot.StartsWith(".\\"))
                    {
                        relativeLocalFileWithExpandedDot = Path.Combine(module.ToFilePath, relativeLocalFileWithExpandedDot.Remove(0, 2));
                    }

                    string localFile = Path.Combine(JsonSchemaApplicationRoot, TransformToCamelCase(relativeLocalFileWithExpandedDot));
                    string uriWithoutFragmentString = jsonSchemaBuilderIriReference.IriReference.OriginalString;
                    if (!string.IsNullOrWhiteSpace(jsonSchemaBuilderIriReference.Fragment))
                    {
                        uriWithoutFragmentString = uriWithoutFragmentString.Replace("#" + jsonSchemaBuilderIriReference.Fragment, "");
                    }
                    if (Uri.TryCreate(uriWithoutFragmentString, UriKind.RelativeOrAbsolute, out Uri uriWithoutFragment))
                    {
                        if (!File.Exists(localFile))
                        {
                            if (jsonSchemaBuilderIriReference.IriReference.IsAbsoluteUri && !jsonSchemaBuilderIriReference.IriReference.IsLoopback)
                            {
                                try
                                {
                                    FileInfo fileInfo  = new FileInfo(localFile);
                                    string   directory = fileInfo.Directory.FullName;
                                    if (!Directory.Exists(directory))
                                    {
                                        Directory.CreateDirectory(directory);
                                    }
                                    using (WebClient myWebClient = new WebClient())
                                    {
                                        // Download the Web resource and save it into the current filesystem folder.
                                        myWebClient.DownloadFile(uriWithoutFragment, localFile);
                                        //TODO generate builderparts from schema and register in _registeredJsonSchemas
                                    }
                                }
                                catch (Exception ex)
                                {
                                    throw new CodeGenerationException($"Resource at {uriWithoutFragment} could not be downloaded", ex);
                                }
                            }
                            else
                            {
                                throw new CodeGenerationException($"Iri reference {uriWithoutFragment} was not found locally at {localFile}");
                            }
                        }
                    }
                }
                break;

            case JSBPartType.Schema:
                JSBSchema jsonSchemaBuilderSchema = jsonSchemaBuilderPart as JSBSchema;
                foreach (IJSBPart definition in jsonSchemaBuilderSchema.Definitions.Values)
                {
                    DoReferenceResolution(definition, module);
                }
                if (jsonSchemaBuilderSchema.TopPart != null)
                {
                    DoReferenceResolution(jsonSchemaBuilderSchema.TopPart, module);
                }
                break;

            case JSBPartType.Array:
                JSBArray jsonSchemaBuilderArray = jsonSchemaBuilderPart as JSBArray;
                foreach (IJSBPart part in jsonSchemaBuilderArray.Items)
                {
                    DoReferenceResolution(part, module);
                }
                break;

            case JSBPartType.Object:
                JSBObject jsonSchemaBuilderObject = jsonSchemaBuilderPart as JSBObject;
                foreach (IJSBPart property in jsonSchemaBuilderObject.Properties.Values)
                {
                    DoReferenceResolution(property, module);
                }
                break;

            default:
                break;
            }
        }
Ejemplo n.º 6
0
        private string MakeCorrectItemType(IJSBPart jsonSchemaBuilderPart)
        {
            switch (jsonSchemaBuilderPart.PartType)
            {
            case JSBPartType.Array:
                //TODO support multiple items
                return($"List<{MakeCorrectItemType((jsonSchemaBuilderPart as JSBArray).Items.First())}>");

            case JSBPartType.Object:
                return(jsonSchemaBuilderPart.Name);

            case JSBPartType.Integer:
                return("long");

            case JSBPartType.Number:
                return("double");

            case JSBPartType.Boolean:
                return("bool");

            case JSBPartType.String:
                JSBString jSBString = jsonSchemaBuilderPart as JSBString;
                if (jSBString.Enums.Count > 0)
                {
                    return(jsonSchemaBuilderPart.Name + "Enum");
                }
                return("string");

            case JSBPartType.Date:
                return("DateTime");

            case JSBPartType.DateTime:
                return("DateTime");

            case JSBPartType.Email:
                return("Email");

            case JSBPartType.Time:
                return("DateTime");

            case JSBPartType.Schema:
                JSBSchema jSBSchema = jsonSchemaBuilderPart as JSBSchema;
                if (jSBSchema.TopPart != null)
                {
                    return(MakeCorrectItemType(jSBSchema.TopPart));
                }
                else
                {
                    throw new NotImplementedException($"MakeCorrectItemType for Schema without a topPart has not been implemented");
                }

            case JSBPartType.IriReference:
                JSBRef jsbRef = jsonSchemaBuilderPart as JSBRef;
                var    pair   = LookupReferencedPart(jsbRef);
                if (pair.refPart != null)
                {
                    return(MakeCorrectItemType(pair.refPart));
                }
                else if (pair.schemaValue != null)
                {
                    return(MakeCorrectItemType(pair.schemaValue));
                }
                else
                {
                    throw new CodeGenerationException($"Could not find reference to {jsbRef.RelativeLocalFile}");
                }

            default:
                throw new NotImplementedException($"MakeCorrectItemType for {jsonSchemaBuilderPart.PartType} has not been implemented");
            }
        }
Ejemplo n.º 7
0
        private void GenerateCodeForBuilderPart(CodeBuilder codeBuilder, IdentifierString key, IJSBPart value, Dictionary <string, IJSBPart> definitions = null, bool parentIsArray = false, bool isDefinition = false)
        {
            switch (value.PartType)
            {
            case JSBPartType.Array:
                JSBArray jsonSchemaBuilderArray = value as JSBArray;
                if (jsonSchemaBuilderArray.Enums != null && jsonSchemaBuilderArray.Enums.Count > 0)
                {
                    GenerateEnumArray(codeBuilder, key, jsonSchemaBuilderArray);
                }
                else
                {
                    GenerateOrdinaryArray(codeBuilder, key, jsonSchemaBuilderArray);
                }
                break;

            case JSBPartType.Boolean:
                JSBBoolean jsonSchemaBuilderBoolean = value as JSBBoolean;
                if (jsonSchemaBuilderBoolean.Enums != null && jsonSchemaBuilderBoolean.Enums.Count > 0)
                {
                    GenerateEnumBoolean(codeBuilder, key, jsonSchemaBuilderBoolean);
                }
                else
                {
                    if (!parentIsArray)
                    {
                        GenerateOrdinaryBoolaen(codeBuilder, key, jsonSchemaBuilderBoolean);
                    }
                }
                break;

            case JSBPartType.Date:
                JSBDate jsonSchemaBuilderDate = value as JSBDate;
                if (jsonSchemaBuilderDate.Enums != null && jsonSchemaBuilderDate.Enums.Count > 0)
                {
                    GenerateEnumDate(codeBuilder, key, jsonSchemaBuilderDate);
                }
                else
                {
                    if (!parentIsArray)
                    {
                        GenerateOrdinaryDate(codeBuilder, key, jsonSchemaBuilderDate);
                    }
                }
                break;

            case JSBPartType.DateTime:
                JSBDateTime jsonSchemaBuilderDateTime = value as JSBDateTime;
                if (jsonSchemaBuilderDateTime.Enums != null && jsonSchemaBuilderDateTime.Enums.Count > 0)
                {
                    GenerateEnumDateTime(codeBuilder, key, jsonSchemaBuilderDateTime);
                }
                else
                {
                    if (!parentIsArray)
                    {
                        GenerateOrdinaryDateTime(codeBuilder, key, jsonSchemaBuilderDateTime);
                    }
                }
                break;

            case JSBPartType.Email:
                JSBEmail jsonSchemaBuilderEmail = value as JSBEmail;
                if (jsonSchemaBuilderEmail.Enums != null && jsonSchemaBuilderEmail.Enums.Count > 0)
                {
                    GenerateEnumEmail(codeBuilder, key, jsonSchemaBuilderEmail);
                }
                else
                {
                    GenerateOrdinaryEmail(codeBuilder, key, jsonSchemaBuilderEmail);
                }
                break;

            case JSBPartType.Integer:
                JSBInteger jsonSchemaBuilderInteger = value as JSBInteger;
                if (jsonSchemaBuilderInteger.Enums != null && jsonSchemaBuilderInteger.Enums.Count > 0)
                {
                    GenerateEnumInteger(codeBuilder, key, jsonSchemaBuilderInteger);
                }
                else
                {
                    if (!parentIsArray)
                    {
                        GenerateOrdinaryInteger(codeBuilder, key, jsonSchemaBuilderInteger);
                    }
                }
                break;

            case JSBPartType.Number:
                JSBNumber jsonSchemaBuilderNumber = value as JSBNumber;
                if (jsonSchemaBuilderNumber.Enums != null && jsonSchemaBuilderNumber.Enums.Count > 0)
                {
                    GenerateEnumNumber(codeBuilder, key, jsonSchemaBuilderNumber);
                }
                else
                {
                    if (!parentIsArray)
                    {
                        GenerateOrdinaryNumber(codeBuilder, key, jsonSchemaBuilderNumber);
                    }
                }
                break;

            case JSBPartType.Object:
                JSBObject jsonSchemaBuilderObject = value as JSBObject;
                if (jsonSchemaBuilderObject.Enums != null && jsonSchemaBuilderObject.Enums.Count > 0)
                {
                    GenerateEnumObject(codeBuilder, key, jsonSchemaBuilderObject, definitions);
                }
                else
                {
                    GenerateOrdinaryObject(codeBuilder, key, jsonSchemaBuilderObject, definitions, parentIsArray);
                }
                break;

            case JSBPartType.String:
                JSBString jsonSchemaBuilderString = value as JSBString;
                if (jsonSchemaBuilderString.Enums != null && jsonSchemaBuilderString.Enums.Count > 0)
                {
                    GenerateEnumString(codeBuilder, key, jsonSchemaBuilderString, isDefinition);
                }
                else
                {
                    GenerateOrdinaryString(codeBuilder, key, jsonSchemaBuilderString);
                }
                break;

            case JSBPartType.Time:
                JSBTime jsonSchemaBuilderTime = value as JSBTime;
                if (jsonSchemaBuilderTime.Enums != null && jsonSchemaBuilderTime.Enums.Count > 0)
                {
                    GenerateEnumTime(codeBuilder, key, jsonSchemaBuilderTime);
                }
                else
                {
                    GenerateOrdinaryTime(codeBuilder, key, jsonSchemaBuilderTime);
                }
                break;

            case JSBPartType.IriReference:
                //Reference cannot be an enum
                if (!parentIsArray)
                {
                    JSBRef jsonSchemaBuilderUriReference = value as JSBRef;
                    GenerateOrdinaryUriReference(codeBuilder, key, jsonSchemaBuilderUriReference);
                }
                break;

            default:
                codeBuilder.L($"throw new NotImplementedException(\"PartType {value.PartType} is not implemented\");");
                break;
            }
        }