Files
chapter-organizer/Core/Parsers/AssignmentRequirementParser.cs
T
poprhythmandCursor 29101e2ead feat: add optional student nickname for informal display
Keep legal first and last names for formal lists; show DisplayFirstName on teams, calendars, and import matching so two Josiahs can be told apart.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-12 00:06:33 -04:00

67 lines
1.9 KiB
C#

using Core.Entities;
using Core.Models;
namespace Core.Parsers;
public class AssignmentRequirementParser : CsvParserBase
{
public AssignmentRequirementParser(FileSystemInfo csvFile, bool ignoreBlankLines = true) : base(csvFile, ignoreBlankLines)
{
}
public AssignmentRequirementParser(StreamReader reader, bool ignoreBlankLines = true) : base(reader, ignoreBlankLines)
{
}
public AssignmentRequirement[] Parse(ICollection<EventDefinition> events, ICollection<Student> students)
{
var assumptions = new List<AssignmentRequirement>();
CsvReader.Read();
CsvReader.ReadHeader();
var studentColumns =
CsvReader.HeaderRecord!.Select(h => h.Trim()).Where(h => !string.IsNullOrEmpty(h)).ToArray();
var studentArray =
studentColumns
.Select(c => students.FirstOrDefault(s =>
string.Equals(s.DisplayFirstName, c, StringComparison.OrdinalIgnoreCase)
|| string.Equals(s.Nickname, c, StringComparison.OrdinalIgnoreCase)
|| string.Equals(s.FirstName, c, StringComparison.OrdinalIgnoreCase)))
.ToArray();
while (CsvReader.Read())
{
var eventShortName= CsvReader.GetField(0);
var evt = events.FirstOrDefault(e => e.ShortName == eventShortName);
if (evt == null)
throw new Exception($"Could not find eventDefinition named {eventShortName}");
for (int i = 0; i < studentArray.Length; i++)
{
var student = studentArray[i];
if (student == null)
continue;
var field = CsvReader.GetField(i + 1);
switch (field)
{
case "x":
case "X":
assumptions.Add(new AssignmentRequirement(evt, student, Requirement.Exclude));
break;
case "i":
case "I":
assumptions.Add(new AssignmentRequirement(evt, student, Requirement.Include));
break;
default:
break;
}
}
}
return assumptions.ToArray();
}
}