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