Line data Source code
1 : import 'package:flutter/painting.dart';
2 : import 'package:folly_fields/crud/abstract_consumer.dart';
3 : import 'package:folly_fields/crud/abstract_model.dart';
4 : import 'package:folly_fields/folly_fields.dart';
5 : import 'package:folly_fields/util/decimal.dart';
6 : import 'package:folly_fields/validators/color_validator.dart';
7 :
8 : ///
9 : ///
10 : ///
11 : class ModelUtils {
12 : ///
13 : ///
14 : ///
15 0 : static Color fromJsonColor(
16 : String? value, [
17 : int defaultColor = 0x00000000,
18 : ]) =>
19 0 : ColorValidator().parse(value) ?? Color(defaultColor);
20 :
21 : ///
22 : ///
23 : ///
24 2 : static DateTime fromJsonDateMillis(
25 : int? millis, [
26 : DateTime? defaultDateTime,
27 : ]) =>
28 4 : fromJsonNullableDateMillis(millis) ?? defaultDateTime ?? DateTime.now();
29 :
30 : ///
31 : ///
32 : ///
33 1 : static DateTime fromJsonDateSecs(
34 : int? secs, [
35 : DateTime? defaultDateTime,
36 : ]) =>
37 2 : fromJsonDateMillis(secs == null ? null : (secs * 1000), defaultDateTime);
38 :
39 : ///
40 : ///
41 : ///
42 : // TODO(edufolly): Remove in version 1.0.0.
43 0 : @Deprecated('Use fromJsonDecimalInt instead. '
44 : 'This method will be removed in version 1.0.0.')
45 : static Decimal fromJsonDecimal(
46 : int? value,
47 : int? precision,
48 : ) =>
49 0 : fromJsonDecimalInt(value, precision);
50 :
51 : ///
52 : ///
53 : ///
54 0 : static Decimal fromJsonDecimalDouble(
55 : double? value,
56 : int? precision,
57 : ) =>
58 0 : Decimal(doubleValue: value ?? 0, precision: precision ?? 2);
59 :
60 : ///
61 : ///
62 : ///
63 0 : static Decimal fromJsonDecimalInt(
64 : int? value,
65 : int? precision,
66 : ) =>
67 0 : Decimal(intValue: value ?? 0, precision: precision ?? 2);
68 :
69 : ///
70 : ///
71 : ///
72 0 : static List<T> fromJsonList<T extends AbstractModel<Object>>(
73 : List<dynamic>? value,
74 : AbstractConsumer<T> consumer,
75 : ) =>
76 0 : _fromJsonRawIterable<T>(
77 : value,
78 0 : producer: (dynamic e) => consumer.fromJson(e),
79 0 : )?.toList() ??
80 0 : <T>[];
81 :
82 : ///
83 : ///
84 : ///
85 0 : static T? fromJsonModel<T extends AbstractModel<Object>>(
86 : Map<String, dynamic>? map,
87 : AbstractConsumer<T> consumer,
88 : ) =>
89 0 : map != null ? consumer.fromJson(map) : null;
90 :
91 : ///
92 : ///
93 : ///
94 4 : static DateTime? fromJsonNullableDateMillis(int? millis) =>
95 8 : millis != null && millis >= 0 && millis <= 8640000000000000
96 4 : ? DateTime.fromMillisecondsSinceEpoch(millis)
97 : : null;
98 :
99 : ///
100 : ///
101 : ///
102 1 : static DateTime? fromJsonNullableDateSecs(int? secs) =>
103 2 : fromJsonNullableDateMillis(secs == null ? null : (secs * 1000));
104 :
105 : ///
106 : ///
107 : ///
108 2 : static Iterable<T>? _fromJsonRawIterable<T>(
109 : Iterable<dynamic>? value, {
110 : required T Function(dynamic e) producer,
111 : }) =>
112 2 : value?.map<T>(producer);
113 :
114 : ///
115 : ///
116 : ///
117 0 : static Map<T, U> fromJsonRawMap<T, U>(
118 : Map<dynamic, dynamic>? value, {
119 : required T Function(dynamic k) keyProducer,
120 : required U Function(dynamic v) valueProducer,
121 : }) =>
122 0 : value?.map<T, U>(
123 0 : (dynamic key, dynamic value) => MapEntry<T, U>(
124 0 : keyProducer(key),
125 0 : valueProducer(value),
126 : ),
127 : ) ??
128 0 : <T, U>{};
129 :
130 : ///
131 : ///
132 : ///
133 0 : static List<T> fromJsonSafeList<T>(
134 : dynamic value, {
135 : required T Function(dynamic e) producer,
136 : }) =>
137 : value == null
138 0 : ? <T>[]
139 0 : : (value is Iterable)
140 0 : ? _fromJsonRawIterable<T>(value, producer: producer)?.toList() ??
141 0 : <T>[]
142 0 : : <T>[producer(value)];
143 :
144 : ///
145 : ///
146 : ///
147 1 : static Set<T> fromJsonSafeSet<T>(
148 : dynamic value, {
149 : required T Function(dynamic e) producer,
150 : }) =>
151 : value == null
152 : ? <T>{}
153 1 : : (value is Iterable)
154 2 : ? _fromJsonRawIterable<T>(value, producer: producer)?.toSet() ??
155 : <T>{}
156 1 : : <T>{producer(value)};
157 :
158 : ///
159 : ///
160 : ///
161 0 : static List<String> fromJsonSafeStringList(dynamic value) =>
162 0 : fromJsonSafeList<String>(
163 : value,
164 : producer: stringProducer,
165 : );
166 :
167 : ///
168 : ///
169 : ///
170 0 : static Set<String> fromJsonSafeStringSet(dynamic value) =>
171 0 : fromJsonSafeSet<String>(
172 : value,
173 : producer: stringProducer,
174 : );
175 :
176 : ///
177 : ///
178 : ///
179 1 : static Set<T> fromJsonSet<T extends AbstractModel<Object>>(
180 : Set<dynamic>? value,
181 : AbstractConsumer<T> consumer,
182 : ) =>
183 1 : _fromJsonRawIterable<T>(
184 : value,
185 2 : producer: (dynamic e) => consumer.fromJson(e),
186 1 : )?.toSet() ??
187 : <T>{};
188 :
189 : ///
190 : ///
191 : ///
192 0 : static String stringProducer(dynamic e) => e.toString();
193 :
194 : ///
195 : ///
196 : ///
197 0 : static String toMapColor(Color color) => ColorValidator().format(color);
198 :
199 : ///
200 : ///
201 : ///
202 0 : static int toMapDateMillis(DateTime dateTime) =>
203 0 : dateTime.millisecondsSinceEpoch;
204 :
205 : ///
206 : ///
207 : ///
208 0 : static int toMapDateSecs(DateTime dateTime) =>
209 0 : dateTime.millisecondsSinceEpoch ~/ 1000;
210 :
211 : ///
212 : ///
213 : ///
214 : // TODO(edufolly): Remove in version 1.0.0.
215 0 : @Deprecated('Use toMapDecimalInt instead. '
216 : 'This method will be removed in version 1.0.0.')
217 0 : static int toMapDecimal(Decimal decimal) => toMapDecimalInt(decimal);
218 :
219 : ///
220 : ///
221 : ///
222 0 : static double toMapDecimalDouble(Decimal decimal) => decimal.doubleValue;
223 :
224 : ///
225 : ///
226 : ///
227 0 : static int toMapDecimalInt(Decimal decimal) => decimal.intValue;
228 :
229 : ///
230 : ///
231 : ///
232 0 : static List<Map<String, dynamic>> toMapList<T extends AbstractModel<Object>>(
233 : List<T> list,
234 : ) =>
235 0 : list.map((T e) => e.toMap()).toList();
236 :
237 : ///
238 : ///
239 : ///
240 0 : static Map<String, dynamic>? toMapModel<T extends AbstractModel<Object>>(
241 : T? model,
242 : ) =>
243 0 : model?.toMap();
244 :
245 : ///
246 : ///
247 : ///
248 0 : static int? toMapNullableDateMillis(DateTime? dateTime) =>
249 0 : dateTime?.millisecondsSinceEpoch;
250 :
251 : ///
252 : ///
253 : ///
254 0 : static int? toMapNullableDateSecs(DateTime? dateTime) =>
255 0 : dateTime == null ? null : dateTime.millisecondsSinceEpoch ~/ 1000;
256 :
257 : ///
258 : ///
259 : ///
260 0 : static Set<Map<String, dynamic>> toMapSet<T extends AbstractModel<Object>>(
261 : Set<T> set,
262 : ) =>
263 0 : set.map((T e) => e.toMap()).toSet();
264 :
265 : ///
266 : ///
267 : ///
268 0 : static void _toSaveMapOnlyId(Map<String, dynamic>? map) => map?.removeWhere(
269 0 : (String key, dynamic value) => key != FollyFields().modelIdKey,
270 : );
271 :
272 : ///
273 : ///
274 : ///
275 0 : static void toSaveListMapOnlyId(List<dynamic>? list) => list
276 0 : ?.map(
277 0 : (dynamic e) => e is Map<String, dynamic> ? _toSaveMapOnlyId(e) : null,
278 : )
279 0 : .toList();
280 :
281 : ///
282 : ///
283 : ///
284 0 : static List<Map<String, dynamic>>?
285 : toSaveList<T extends AbstractModel<Object>>(
286 : List<T>? list,
287 : ) =>
288 0 : _toSaveIterable(list)?.toList();
289 :
290 : ///
291 : ///
292 : ///
293 0 : static void toSaveSetMapOnlyId(Set<dynamic>? set) => set
294 0 : ?.map(
295 0 : (dynamic e) => e is Map<String, dynamic> ? _toSaveMapOnlyId(e) : null,
296 : )
297 0 : .toSet();
298 :
299 : ///
300 : ///
301 : ///
302 0 : static Set<Map<String, dynamic>>? toSaveSet<T extends AbstractModel<Object>>(
303 : Set<T>? set,
304 : ) =>
305 0 : _toSaveIterable(set)?.toSet();
306 :
307 : ///
308 : ///
309 : ///
310 0 : static Iterable<Map<String, dynamic>>?
311 : _toSaveIterable<T extends AbstractModel<Object>>(Iterable<T>? iterable) =>
312 0 : iterable?.map((T e) => e.toSave());
313 : }
|