1 /**
2 * Copyright © DiamondMVC 2018
3 * License: MIT (https://github.com/DiamondMVC/Diamond/blob/master/LICENSE)
4 * Author: Jacob Jensen (bausshf)
5 */
6 module diamond.data.mapping.model;
7 
8 /// Base-interface for a model.
9 interface IModel { }
10 
11 /// Wrapper for a base model.
12 abstract class Model : IModel
13 {
14   private:
15 	/// The reader.
16   void delegate() _reader;
17 	/// The inserter.
18   void delegate() _inserter;
19 	/// The updater.
20   void delegate() _updater;
21 	/// The deleter.
22   void delegate() _deleter;
23 
24   public:
25   final:
26 	/// Creates a new model.
27   this
28 	(
29 		void delegate() reader,
30 		void delegate() inserter,
31 		void delegate() updater,
32 		void delegate() deleter
33 	)
34   {
35 		_reader = reader;
36 		_inserter = inserter;
37 		_updater = updater;
38 		_deleter = deleter;
39   }
40 
41 	/// Reads the model from the reader. Called internally from readSingle & readMany
42   void readModel() @system
43   {
44     if (_reader)
45     {
46       _reader();
47     }
48   }
49 
50 	/// Inserts the model.
51   void insertModel() @system
52   {
53     if (_inserter)
54     {
55       _inserter();
56     }
57   }
58 
59 	/// Updates the model.
60   void updateModel() @system
61   {
62     if (_updater)
63     {
64       _updater();
65     }
66   }
67 
68 	/// Deletes the model.
69   void deleteModel() @system
70   {
71     if (_deleter)
72     {
73       _deleter();
74     }
75   }
76 }
77 
78 // TODO: Optimize these to do CTFE:
79 
80 /**
81 * Inserts an array of models.
82 *	Params:
83 *		models = The models to insert.
84 */
85 void insertMany(T : IModel)(T[] models) @system
86 {
87   foreach (model; models)
88   {
89     model.insertModel();
90   }
91 }
92 
93 /**
94 * Updates an array of models.
95 *	Params:
96 *		models = The models to update.
97 */
98 void updateMany(T : IModel)(T[] models) @system
99 {
100   foreach (model; models)
101   {
102     model.updateModel();
103   }
104 }
105 
106 /**
107 * Deletes an array of models.
108 *	Params:
109 *		models = The models to delete.
110 */
111 void deleteMany(T : IModel)(T[] models) @system
112 {
113   foreach (model; models)
114   {
115     model.deleteModel();
116   }
117 }