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); }
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"); } } }