module cif.header; import std.datetime.date : Date, DateTime; import std.conv : to; import std.string : strip; import cif.types : UpdateType; import cif.utils : twoToFourYear; struct Header { string fileMainframeIdentity; DateTime extractedOn; string currentFileReference; string lastFileReference; UpdateType updateType; char softwareVersion; Date extractStart; Date extractEnd; this(string record) { this.fileMainframeIdentity = record[2 .. 22]; this.extractedOn = DateTime(twoToFourYear(to!int(record[26 .. 28])), to!int(record[24 .. 26]), to!int(record[22 .. 24]), to!int(record[28 .. 30]), to!int(record[30 .. 32])); this.currentFileReference = record[32 .. 39]; this.lastFileReference = strip(record[39 .. 46]); this.updateType = to!UpdateType(record[46]); this.softwareVersion = record[47]; this.extractStart = Date(twoToFourYear(to!int(record[52 .. 54])), to!int(record[50 .. 52]), to!int(record[48 .. 50])); this.extractEnd = Date(twoToFourYear(to!int(record[58 .. 60])), to!int(record[56 .. 58]), to!int(record[54 .. 56])); } unittest { auto line = "HDTPS.UCFCATE.PD1712080812172003DFTTISV FA081217091218 "; const Header header = Header(line); assert(header.fileMainframeIdentity == "TPS.UCFCATE.PD171208"); assert(header.extractedOn == DateTime(2017, 12, 8, 20, 3)); assert(header.currentFileReference == "DFTTISV"); assert(header.lastFileReference == ""); assert(header.updateType == UpdateType.full); assert(header.softwareVersion == 'A'); assert(header.extractStart == Date(2017, 12, 8)); assert(header.extractEnd == Date(2018, 12, 9)); } }