public static HeaderRecord Parse(ReadOnlySpan <char> input) { if (input.Length < 5) { throw new ArgumentException("Minimal header length is 5 chars"); } var recordType = RecordType.Parse(input); if (recordType != RecordType.MessageHeader) { throw new ArgumentException("This is not header record"); } var delimiters = Delimiters.Parse(input.Slice(1, 4)); var messageControlID = new string(input.GetField(delimiters.FieldDelimiter, 2)); var accessPassword = new string(input.GetField(delimiters.FieldDelimiter, 3)); var senderID = new string(input.GetField(delimiters.FieldDelimiter, 4)); var senderStreetAddress = new string(input.GetField(delimiters.FieldDelimiter, 5)); var reserved0 = new string(input.GetField(delimiters.FieldDelimiter, 6)); var senderTelephoneNumber = new string(input.GetField(delimiters.FieldDelimiter, 7)); var senderCharacteristics = new string(input.GetField(delimiters.FieldDelimiter, 8)); var receiverID = new string(input.GetField(delimiters.FieldDelimiter, 9)); var comment = new string(input.GetField(delimiters.FieldDelimiter, 10)); var processingType = input.GetField(delimiters.FieldDelimiter, 11); var processingID = processingType.IsEmpty ? default(ProcessingType?) : ProcessingType.Parse(processingType[0]); var versionNumber = new string(input.GetField(delimiters.FieldDelimiter, 12)); var msgDateTime = default(DateTimeField?); var msgDTField = input.GetField(delimiters.FieldDelimiter, 13); if (!msgDTField.IsEmpty) { msgDateTime = DateTimeField.Parse(msgDTField); } return(new HeaderRecord( delimiters, messageControlID, accessPassword, senderID, senderStreetAddress, reserved0, senderTelephoneNumber, senderCharacteristics, receiverID, comment, processingID, versionNumber, msgDateTime)); }