1 module cif.association; 2 3 import std.conv : to; 4 import std.datetime.date : Date, DayOfWeek; 5 import std.string : strip; 6 7 import cif.types : AssociationType, TransactionType; 8 import cif.utils : daysRunning, twoToFourYear; 9 10 struct Association 11 { 12 TransactionType transactionType; 13 string mainTrainUID; 14 string associatedTrainUID; 15 Date start; 16 Date end; 17 DayOfWeek[] days; 18 string category; 19 char dateIndicator; 20 string location; 21 char baseLocationSuffix; 22 char assocLocationSuffix; 23 char diagramType = 'T'; 24 AssociationType type; 25 char stpIndicator; 26 27 this(string record) 28 { 29 this.transactionType = to!TransactionType(record[2]); 30 this.mainTrainUID = record[3 .. 9]; 31 this.associatedTrainUID = record[9 .. 15]; 32 this.start = Date(twoToFourYear(to!int(record[15 .. 17])), 33 to!int(record[17 .. 19]), to!int(record[19 .. 21])); 34 this.end = Date(twoToFourYear(to!int(record[21 .. 23])), 35 to!int(record[23 .. 25]), to!int(record[25 .. 27])); 36 this.days = daysRunning(record[27 .. 34]); 37 this.category = record[34 .. 36]; 38 this.dateIndicator = record[36]; 39 this.location = strip(record[37 .. 44]); 40 this.baseLocationSuffix = record[44]; 41 this.assocLocationSuffix = record[45]; 42 this.diagramType = record[46]; 43 this.type = to!AssociationType(record[47]); 44 this.stpIndicator = record[79]; 45 } 46 47 unittest 48 { 49 auto line = "AANG72112G740651712161805190000010VVSHORSHAM TP P"; 50 const Association association = Association(line); 51 52 assert(association.transactionType == TransactionType.new_); 53 assert(association.mainTrainUID == "G72112"); 54 assert(association.associatedTrainUID == "G74065"); 55 assert(association.start == Date(2017, 12, 16)); 56 assert(association.end == Date(2018, 5, 19)); 57 assert(association.days == [DayOfWeek.sat]); 58 assert(association.category == "VV"); 59 assert(association.dateIndicator == 'S'); 60 assert(association.location == "HORSHAM"); 61 assert(association.baseLocationSuffix == ' '); 62 assert(association.assocLocationSuffix == ' '); 63 assert(association.diagramType == 'T'); 64 assert(association.type == AssociationType.passengerUse); 65 assert(association.stpIndicator == 'P'); 66 } 67 }