示例#1
0
        private NetClassField ResolveField(JObject typeObj)
        {
            NetClassField result = new NetClassField();

            string objectType = typeObj["type"].ToString();

            switch (objectType)
            {
            case "record":
            case "enum":
                result.FieldType = typeObj["name"].ToString();
                break;

            case "array":
                result = _arrayResolver.ResolveArray(typeObj);
                break;

            case "map":
                result.FieldType = _mapModelResolver.ResolveMap(typeObj);
                break;

            default:
            {
                if (typeObj["logicalType"] != null)
                {
                    result.FieldType = _logicalResolver.ResolveLogical(typeObj);
                }
                else
                {
                    result.FieldType = objectType;
                }

                break;
            }
            }

            string shortType = result.FieldType.Split('.').Last();

            if (string.IsNullOrEmpty(result.Namespace))
            {
                result.Namespace = _namespaceHelper.ExtractNamespace(typeObj, result.FieldType, shortType);
            }

            shortType = shortType.TryReplace("boolean", "bool");
            shortType = shortType.TryReplace("bytes", "byte[]");
            shortType = shortType.TryReplace("fixed", "byte[]");

            result.FieldType = shortType;


            return(result);
        }
        internal NetClassField ResolveArray(JObject typeObj)
        {
            var avroField = new NetClassField();

            // If this is an array of a specific class that's being defined in this area of the json
            if (typeObj["items"] is JObject && ((JObject)typeObj["items"])["type"].ToString() == "record")
            {
                avroField.FieldType = ((JObject)typeObj["items"])["name"] + "[]";
                avroField.Namespace = ((JObject)typeObj["items"])["namespace"]?.ToString();
            }
            else if (typeObj["items"] is JValue value)
            {
                avroField.FieldType = value + "[]";
            }
            else
            {
                throw new InvalidAvroObjectException($"{typeObj}");
            }

            return(avroField);
        }
示例#3
0
        private void ResolveRecord(JObject parent, NetModel.NetModel model)
        {
            var      shortName = parent["name"].ToString().Split('.').Last();
            NetClass c         = new NetClass()
            {
                Name           = shortName,
                ClassNamespace = _namespaceHelper.ExtractNamespace(parent, parent["name"].ToString(), shortName)
            };

            model.NetTypes.Add(c);

            // Get Fields
            foreach (var field in parent["fields"] as JArray)
            {
                if (field is JObject fieldObject)
                {
                    // Get Field type
                    NetClassField fieldType  = new NetClassField();
                    bool          isNullable = false;

                    switch (field["type"])
                    {
                    case JValue _:
                        fieldType = ResolveField(fieldObject);
                        break;

                    case JObject fieldJObject:
                        fieldType = ResolveField(fieldJObject);
                        break;

                    case JArray types:
                    {
                        if (types.Any(t => t.ToString() == "null"))
                        {
                            isNullable = true;
                        }

                        if (types.Count > 2)
                        {
                            throw new InvalidAvroObjectException(
                                      $"Unable to determine acceptable data type for {field["type"]}");
                        }

                        // Is the field type an object that's defined in this spot
                        JToken arrayFieldType = types.FirstOrDefault(x => x.ToString() != "null");

                        switch (arrayFieldType)
                        {
                        case JValue _:
                            fieldObject["type"] = arrayFieldType;
                            fieldType           = ResolveField(fieldObject);
                            break;

                        case JObject arrayFieldJObject:
                            fieldType = ResolveField(arrayFieldJObject);
                            break;

                        default:
                            throw new InvalidAvroObjectException($"Unable to create array in array {arrayFieldType}");
                        }

                        break;
                    }

                    default:
                        throw new InvalidAvroObjectException($"Unable to process field type of {field["type"].GetType().Name}");
                    }

                    if (isNullable)
                    {
                        fieldType.FieldType += "?";
                    }

                    fieldType.Name = field["name"].ToString();

                    if (field["default"] is JValue)
                    {
                        fieldType.Default = field["default"].ToString();
                    }

                    if (field["doc"] is JValue)
                    {
                        fieldType.Doc = field["doc"].ToString();
                    }

                    c.Fields.Add(fieldType);
                }
                else
                {
                    throw new InvalidAvroObjectException($"Field type {field.GetType().Name} not supported");
                }
            }
        }