Given the following example model...
[GenerateSerde]
public partial record class Person
(
[property: FixedFieldInfo(0, 10)] string FirstName,
[property: FixedFieldInfo(10, 10)] string LastName,
[property: FixedFieldInfo(20, 5)] int EmployeeId,
[property: FixedFieldInfo(25, 8, format: "MMddyyyy")] DateTime Birthday
)
{
[FixedFieldInfo(25, 3, "D3")]
public int Age => DateOnly.FromDateTime(DateTime.Today).Year - Birthday.Year;
}
Person.ISerde.g.cs will generate with the following code (comments own):
Serde.FixedWidth.Tests.Person Serde.IDeserialize<Serde.FixedWidth.Tests.Person>.Deserialize(IDeserializer deserializer)
{
string _l_firstname = default!;
string _l_lastname = default!;
int _l_employeeid = default!;
System.DateTime _l_birthday = default!;
int _l_age = default!;
byte _r_assignedValid = 0;
var _l_serdeInfo = global::Serde.SerdeInfoProvider.GetInfo(this);
var typeDeserialize = deserializer.ReadType(_l_serdeInfo);
while (true)
{
var (_l_index_, _) = typeDeserialize.TryReadIndexWithName(_l_serdeInfo);
if (_l_index_ == Serde.ITypeDeserializer.EndOfType)
{
break;
}
switch (_l_index_)
{
// Snip
// Case 4 should generate with an empty body, or only with the appropriate checks.
case 4:
Serde.DeserializeException.ThrowIfDuplicate(_r_assignedValid, 4, _l_serdeInfo);
_l_age = typeDeserialize.ReadI32(_l_serdeInfo, _l_index_);
_r_assignedValid |= ((byte)1) << 4;
break;
case Serde.ITypeDeserializer.IndexNotFound:
typeDeserialize.SkipValue(_l_serdeInfo, _l_index_);
break;
default:
throw new InvalidOperationException("Unexpected index: " + _l_index_);
}
}
if ((_r_assignedValid & 0b11111) != 0b11111)
{
throw Serde.DeserializeException.UnassignedMember();
}
// Or, Age should not be assigned here.
var newType = new Serde.FixedWidth.Tests.Person(_l_firstname, _l_lastname, _l_employeeid, _l_birthday) {
Age = _l_age,
};
return newType;
}
Given the following example model...
Person.ISerde.g.cs will generate with the following code (comments own):