1 /* 2 * hunt-proton: AMQP Protocol library for D programming language. 3 * 4 * Copyright (C) 2018-2019 HuntLabs 5 * 6 * Website: https://www.huntlabs.net/ 7 * 8 * Licensed under the Apache-2.0 License. 9 * 10 */ 11 12 module hunt.proton.codec.TimestampType; 13 14 import hunt.proton.codec.EncoderImpl; 15 import hunt.proton.codec.DecoderImpl; 16 import hunt.proton.codec.AbstractPrimitiveType; 17 import hunt.collection.Collection; 18 import hunt.collection.Collections; 19 import hunt.time.LocalDateTime; 20 21 import hunt.proton.codec.TypeEncoding; 22 import hunt.proton.codec.FixedSizePrimitiveTypeEncoding; 23 import hunt.proton.codec.EncodingCodes; 24 import hunt.proton.codec.PrimitiveTypeEncoding; 25 import hunt.logging; 26 27 alias Date = LocalDateTime; 28 29 class TimestampType : AbstractPrimitiveType!(Date) 30 { 31 private TimestampEncoding _timestampEncoding; 32 33 this(EncoderImpl encoder, DecoderImpl decoder) 34 { 35 _timestampEncoding = new TimestampEncoding(encoder, decoder); 36 encoder.register(typeid(Date), this); 37 decoder.register(this); 38 } 39 40 public TypeInfo getTypeClass() 41 { 42 return typeid(Date); 43 } 44 45 public ITypeEncoding getEncoding(Object val) 46 { 47 return _timestampEncoding; 48 } 49 50 public void fastWrite(EncoderImpl encoder, long timestamp) 51 { 52 encoder.writeRaw(EncodingCodes.TIMESTAMP); 53 encoder.writeRaw(timestamp); 54 } 55 56 public TimestampEncoding getCanonicalEncoding() 57 { 58 return _timestampEncoding; 59 } 60 61 public Collection!(TypeEncoding!(LocalDateTime)) getAllEncodings() 62 { 63 return Collections.singleton!(TypeEncoding!(LocalDateTime))(_timestampEncoding); 64 } 65 66 //public Collection!(PrimitiveTypeEncoding!(LocalDateTime)) getAllEncodings() 67 //{ 68 // return super.getAllEncodings(); 69 //} 70 71 public void write(long l) 72 { 73 _timestampEncoding.write(l); 74 } 75 76 class TimestampEncoding : FixedSizePrimitiveTypeEncoding!(Date) 77 { 78 79 this(EncoderImpl encoder, DecoderImpl decoder) 80 { 81 super(encoder, decoder); 82 } 83 84 override 85 protected int getFixedSize() 86 { 87 return 8; 88 } 89 90 override 91 public byte getEncodingCode() 92 { 93 return EncodingCodes.TIMESTAMP; 94 } 95 96 public TimestampType getType() 97 { 98 return this.outer; 99 } 100 101 public void writeValue(Object val) 102 { 103 getEncoder().writeRaw((cast(Date)val).toEpochMilli()); 104 } 105 106 public void write(long l) 107 { 108 writeConstructor(); 109 getEncoder().writeRaw(l); 110 111 } 112 113 public bool encodesSuperset(TypeEncoding!(Date) encoding) 114 { 115 return (getType() == encoding.getType()); 116 } 117 118 public Date readValue() 119 { 120 return Date.ofEpochMilli(getDecoder().readRawLong()); 121 } 122 } 123 }