public static RecordStructuralTypeDef FromJson(DeserializationDomain domain, Json.ArrayExpression type) { if (domain.IsV08) { throw new NotSupportedException("Record types are only supported in Bonsai v0.9 or later."); } var count = type.ElementCount; if (count is not 2 and not 3) { throw new BonsaiParseException("Expected 2 or 3 JSON array elements for a structural type definition.", type); } if (type.GetElement(1) is not Json.ArrayExpression membersJson) { throw new BonsaiParseException("Expected a JSON array in 'node[1]' for the structural type members.", type); } var membersCount = membersJson.ElementCount; var members = new RecordStructuralTypeMember[membersCount]; for (var i = 0; i < membersCount; i++) { var memberJson = membersJson.GetElement(i); var member = RecordStructuralTypeMember.FromJson(memberJson); members[i] = member; } var hasValueEqualitySemantics = true; if (count == 3) { var hasValueEqualitySemanticsExpr = type.GetElement(2); if (hasValueEqualitySemanticsExpr.NodeType != Json.ExpressionType.Boolean) { throw new BonsaiParseException("Expected a JSON Boolean in 'node[2]' for the value equality semantics flag.", type); } hasValueEqualitySemantics = (bool)((Json.ConstantExpression)hasValueEqualitySemanticsExpr).Value; } return(new RecordStructuralTypeDef(hasValueEqualitySemantics, members)); }
private TypeDef AddTypeRecordStructural(StructuralTypeSlim type, ReadOnlyCollection <TypeSlim> genericArguments) { var properties = type.Properties; var count = properties.Count; var members = new RecordStructuralTypeMember[count]; for (var i = 0; i < count; i++) { var property = properties[i]; var member = new RecordStructuralTypeMember { Name = property.Name, Type = AddType(property.PropertyType, genericArguments) }; members[i] = member; } return(new RecordStructuralTypeDef(type.HasValueEqualitySemantics, members)); }