private ICode CreateSpecificEntityIdBody(EntityIdDescriptor entity) { var sourceText = new StringBuilder(); sourceText.AppendLine($"return new {TypeNames.EntityId}("); sourceText.AppendLine(" type,"); if (entity.Fields.Count == 1) { var field = entity.Fields[0]; sourceText.AppendLine( $" obj.GetProperty(\"{field.Name}\").{GetSerializerMethod(field)}()!);"); return(CodeBlockBuilder.From(sourceText)); } sourceText.Append(" ("); var next = false; foreach (var field in entity.Fields) { if (next) { sourceText.AppendLine(","); sourceText.Append(" "); } next = true; sourceText.Append( $"obj.GetProperty(\"{field.Name}\").{GetSerializerMethod(field)}()!"); } sourceText.AppendLine("));"); return(CodeBlockBuilder.From(sourceText)); }
private ICode CreateSpecificEntityIdBody(EntityIdDescriptor entity) { ICode value; if (entity.Fields.Count == 1) { value = CreateEntityIdProperty(entity.Fields[0]); } else { value = TupleBuilder .New() .AddMemberRange(entity.Fields.Select(CreateEntityIdProperty)); } return MethodCallBuilder .New() .SetReturn() .SetNew() .SetMethodName(TypeNames.EntityId) .AddArgument(_type) .AddArgument(value); }
private ICode FormatSpecificEntityIdBody(EntityIdDescriptor entity) { var body = CodeBlockBuilder .New(); body.AddAssigment($"using var {_writer}") .SetRighthandSide( MethodCallBuilder .Inline() .SetNew() .SetMethodName(TypeNames.ArrayWriter)); body.AddAssigment($"using var {_jsonWriter}") .SetRighthandSide( MethodCallBuilder .Inline() .SetNew() .SetMethodName(TypeNames.Utf8JsonWriter) .AddArgument(_writer) .AddArgument(_options)); body.AddMethodCall() .SetMethodName(_jsonWriter, nameof(Utf8JsonWriter.WriteStartObject)); body.AddEmptyLine(); body.AddMethodCall() .SetMethodName(_jsonWriter, nameof(Utf8JsonWriter.WriteString)) .AddArgument(WellKnownNames.TypeName.AsStringToken()) .AddArgument($"{_entityId}.Name"); body.AddEmptyLine(); if (entity.Fields.Count == 1) { ScalarEntityIdDescriptor?field = entity.Fields[0]; body.AddMethodCall() .SetMethodName(_jsonWriter, GetWriteMethod(field)) .AddArgument(field.Name.AsStringToken()) .AddArgument($"({field.SerializationType}){_entityId}.Value"); } else { body.AddAssigment($"var {_entityIdValues}") .SetRighthandSide(CodeBlockBuilder .New() .AddCode("(") .AddCode(TupleBuilder .New() .AddMemberRange( entity.Fields.Select(x => x.SerializationType.ToString()))) .AddCode($"){_entityId}.Value")); body.AddEmptyLine(); for (var index = 0; index < entity.Fields.Count; index++) { ScalarEntityIdDescriptor field = entity.Fields[index]; body.AddMethodCall() .SetMethodName(_jsonWriter, GetWriteMethod(field)) .AddArgument(field.Name.AsStringToken()) .AddArgument($"{_entityIdValues}.Item{index + 1}"); body.AddEmptyLine(); } } body.AddMethodCall() .SetMethodName(_jsonWriter, nameof(Utf8JsonWriter.WriteEndObject)); body.AddMethodCall() .SetMethodName(_jsonWriter, nameof(Utf8JsonWriter.Flush)); body.AddEmptyLine(); body.AddMethodCall() .SetReturn() .SetMethodName(TypeNames.EncodingUtf8, nameof(Encoding.UTF8.GetString)) .AddArgument(MethodCallBuilder.Inline().SetMethodName(_writer, "GetInternalBuffer")) .AddArgument("0") .AddArgument($"{_writer}.Length"); return(body); }
private static string GetSerializerMethod(EntityIdDescriptor field) => $"Get{field.TypeName.Split('.').Last()}";
private static ICode CreateEntityIdProperty(EntityIdDescriptor field) => MethodCallBuilder .Inline() .SetMethodName(_obj, nameof(JsonElement.GetProperty)) .AddArgument(field.Name.AsStringToken()) .Chain(x => x.SetMethodName(GetSerializerMethod(field)).SetNullForgiving());