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
13 module hunt.proton.codec.messaging.PropertiesType;
14
15 import hunt.collection.AbstractList;
16 import hunt.time.LocalDateTime;
17 import hunt.Object;
18 import hunt.collection.List;
19 import hunt.proton.amqp.Binary;
20 import hunt.proton.amqp.Symbol;
21 import hunt.proton.amqp.UnsignedInteger;
22 import hunt.proton.amqp.UnsignedLong;
23 import hunt.proton.amqp.messaging.Properties;
24 import hunt.proton.codec.AbstractDescribedType;
25 import hunt.proton.codec.Decoder;
26 import hunt.proton.codec.DescribedTypeConstructor;
27 import hunt.proton.codec.EncoderImpl;
28 import hunt.Exceptions;
29 import hunt.String;
30 import std.concurrency : initOnce;
31 import std.conv : to;
32
33 alias Date = LocalDateTime;
34
35 class PropertiesWrapper : AbstractList!Object
36 {
37
38 private Properties _impl;
39
40 this(Properties propertiesType)
41 {
42 _impl = propertiesType;
43 }
44
45 override
46 public Object get(int index)
47 {
48
49 switch(index)
50 {
51 case 0:
52 return _impl.getMessageId();
53 case 1:
54 return _impl.getUserId();
55 case 2:
56 return _impl.getTo();
57 case 3:
58 return _impl.getSubject();
59 case 4:
60 return _impl.getReplyTo();
61 case 5:
62 return _impl.getCorrelationId();
63 case 6:
64 return _impl.getContentType();
65 case 7:
66 return _impl.getContentEncoding();
67 case 8:
68 return _impl.getAbsoluteExpiryTime();
69 case 9:
70 return _impl.getCreationTime();
71 case 10:
72 return _impl.getGroupId();
73 case 11:
74 return _impl.getGroupSequence();
75 case 12:
76 return _impl.getReplyToGroupId();
77 default:
78 break;
79 }
80
81 throw new IllegalStateException("Unknown index " ~ to!string(index));
82
83 }
84
85 override
86 public int size()
87 {
88 return _impl.getReplyToGroupId() !is null
89 ? 13
90 : _impl.getGroupSequence() !is null
91 ? 12
92 : _impl.getGroupId() !is null
93 ? 11
94 : _impl.getCreationTime() !is null
95 ? 10
96 : _impl.getAbsoluteExpiryTime() !is null
97 ? 9
98 : _impl.getContentEncoding() !is null
99 ? 8
100 : _impl.getContentType() !is null
101 ? 7
102 : _impl.getCorrelationId() !is null
103 ? 6
104 : _impl.getReplyTo() !is null
105 ? 5
106 : _impl.getSubject() !is null
107 ? 4
108 : _impl.getTo() !is null
109 ? 3
110 : _impl.getUserId() !is null
111 ? 2
112 : _impl.getMessageId() !is null
113 ? 1
114 : 0;
115
116 }
117
118 }
119
120 class PropertiesType : AbstractDescribedType!(Properties,List!Object) , DescribedTypeConstructor!(Properties)
121 {
122 //private static Object[] DESCRIPTORS =
123 //{
124 // UnsignedLong.valueOf(0x0000000000000073L), Symbol.valueOf("amqp:properties:list"),
125 //};
126
127 static Object[] DESCRIPTORS() {
128 __gshared Object[] inst;
129 return initOnce!inst([UnsignedLong.valueOf(0x0000000000000073L), Symbol.valueOf("amqp:properties:list")]);
130 }
131
132 static UnsignedLong DESCRIPTOR() {
133 __gshared UnsignedLong inst;
134 return initOnce!inst(UnsignedLong.valueOf(0x0000000000000073L));
135 }
136
137 // private static UnsignedLong DESCRIPTOR = UnsignedLong.valueOf(0x0000000000000073L);
138
139 this(EncoderImpl encoder)
140 {
141 super(encoder);
142 }
143
144 override
145 public UnsignedLong getDescriptor()
146 {
147 return DESCRIPTOR;
148 }
149
150 override
151 protected List!Object wrap(Properties val)
152 {
153 return new PropertiesWrapper(val);
154 }
155
156
157
158 public Properties newInstance(Object described)
159 {
160 List!Object l = cast(List!Object) described;
161
162 Properties o = new Properties();
163
164
165 switch(13 - l.size())
166 {
167
168 case 0:
169 o.setReplyToGroupId( cast(String) l.get( 12 ) );
170 goto case;
171 case 1:
172 o.setGroupSequence( cast(UnsignedInteger) l.get( 11 ) );
173 goto case;
174 case 2:
175 o.setGroupId( cast(String) l.get( 10 ) );
176 goto case;
177 case 3:
178 o.setCreationTime( cast(Date) l.get( 9 ) );
179 goto case;
180 case 4:
181 o.setAbsoluteExpiryTime( cast(Date) l.get( 8 ) );
182 goto case;
183 case 5:
184 o.setContentEncoding( cast(Symbol) l.get( 7 ) );
185 goto case;
186 case 6:
187 o.setContentType( cast(Symbol) l.get( 6 ) );
188 goto case;
189 case 7:
190 o.setCorrelationId( cast(String) l.get( 5 ) );
191 goto case;
192 case 8:
193 o.setReplyTo( cast(String) l.get( 4 ) );
194 goto case;
195 case 9:
196 o.setSubject( cast(String) l.get( 3 ) );
197 goto case;
198 case 10:
199 o.setTo( cast(String) l.get( 2 ) );
200 goto case;
201 case 11:
202 o.setUserId( cast(Binary) l.get( 1 ) );
203 goto case;
204 case 12:
205 o.setMessageId(cast(String) l.get( 0 ) );
206 break;
207 default:
208 break;
209 }
210
211
212 return o;
213 }
214
215 public TypeInfo getTypeClass()
216 {
217 return typeid(Properties);
218 }
219
220 public static void register(Decoder decoder, EncoderImpl encoder)
221 {
222 PropertiesType type = new PropertiesType(encoder);
223 //implementationMissing(false);
224 foreach(Object descriptor ; DESCRIPTORS)
225 {
226 decoder.registerDynamic(descriptor, type);
227 }
228 encoder.register(type);
229 }
230 }