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 }