1 /**
2   Copyright: 2017 © LLC CERERIS
3   License: MIT
4   Authors: LLC CERERIS
5 */
6 
7 module checkit.blockmanager;
8 
9 import checkit.block;
10 import std.algorithm: canFind;
11 import std..string: format;
12 import std.uuid: UUID;
13 import std.variant;
14 
15 /// Provide managing of blocks
16 interface BlockManagerInterface
17 {
18   public:
19     /// Add block
20     static void addBlock(T)(T block);
21     /// Remove block from storage by UUID
22     static void removeBlockByUUID(UUID uuid);
23     /// Get array of blocks by type from storage
24     static TestBlock!T[] getByType(T, alias U)();
25 }
26 
27 /// Default BlockManager for collection blocks
28 final class BlockManager: BlockManagerInterface
29 {
30   public:
31     /** Add block
32 
33       Params:
34         block = Block that is added to the storage
35 
36       Examples:
37         ---
38         auto scenario = new ScenarioBlock({}, "test", []);
39         BlockManager.addBlock(scenario);
40         ---
41     */
42     static void addBlock(T)(T block)
43     {
44       _blocksMap[block.getUUID()] = block;
45     }
46 
47     /** Remove block from storage by UUID
48 
49       Params:
50         uuid = Unique block identifier
51 
52       Examples:
53         ---
54         auto scenario = new ScenarioBlock({}, "test", []);
55         BlockManager.addBlock(scenario);
56         BlockManager.removeBlockByUUID(scenario.getUUID());
57         ---
58     */
59     static void removeBlockByUUID(UUID uuid)
60     {
61       _blocksMap.remove(uuid);
62     }
63 
64     /** Get array of blocks by type from storage
65 
66       Params:
67         T = Type of block.
68 
69       Examples:
70         ---
71         auto scenario = new ScenarioBlock({}, "test", []);
72         BlockManager.addBlock(scenario);
73         BlockManager.getByType!ScenarioBlock();
74         ---
75     */
76     static T[] getByType(T)()
77     {
78       T[] blocks;
79 
80       foreach(block; _blocksMap)
81       {
82         if(auto temp = cast(T) block)
83         {
84           blocks ~= temp;
85         }
86       }
87 
88       return blocks;
89     }
90 
91   private:
92     static TestBlock[UUID] _blocksMap;
93 }