1 /*
2  * Hunt - A redis client 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.redis.Response;
13 
14 import hunt.redis.Builder;
15 import hunt.redis.Exceptions;
16 
17 abstract class AbstractResponse {
18     protected AbstractResponse dependency = null;
19     protected bool building = false;
20     protected bool built = false;
21     protected bool _set = false;
22 
23     protected RedisDataException exception = null;
24     protected Object data;
25 
26     protected void build();
27     
28     void set(Object data) {
29         this.data = data;
30         _set = true;
31     }
32 
33     void setDependency(AbstractResponse dependency) {
34         this.dependency = dependency;
35     }
36 
37 }
38 
39 alias Response = RedisResponse;
40 
41 class RedisResponse(T) : AbstractResponse {
42     protected T response = null;
43 
44     private Builder!(T) builder;
45 
46     this(Builder!(T) b) {
47         this.builder = b;
48     }
49 
50     T get() {
51         // if response has dependency response and dependency is not built,
52         // build it first and no more!!
53         if (dependency !is null && dependency._set && !dependency.built) {
54             dependency.build();
55         }
56         if (!_set) {
57             throw new RedisDataException(
58                     "Please close pipeline or multi block before calling this method.");
59         }
60         if (!built) {
61             build();
62         }
63         if (exception !is null) {
64             throw exception;
65         }
66         return response;
67     }
68 
69     override protected void build() {
70         // check build state to prevent recursion
71         if (building) {
72             return;
73         }
74 
75         building = true;
76         try {
77             if (data !is null) {
78                 exception = cast(RedisDataException) data;
79                 if (exception is null) {
80                     response = builder.build(data);
81                 }
82             }
83 
84             data = null;
85         } finally {
86             building = false;
87             built = true;
88         }
89     }
90 
91     override
92     string toString() {
93         return "Response " ~ builder.toString();
94     }
95 
96 }