first commit
This commit is contained in:
213
lib/flutterlib/nav/serialization_util.dart
Normal file
213
lib/flutterlib/nav/serialization_util.dart
Normal file
@@ -0,0 +1,213 @@
|
||||
import 'dart:convert';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:from_css_color/from_css_color.dart';
|
||||
|
||||
import '/backend/schema/enums/enums.dart';
|
||||
|
||||
import '../../flutterlib/lat_lng.dart';
|
||||
import '../../flutterlib/place.dart';
|
||||
import '../../flutterlib/uploaded_file.dart';
|
||||
|
||||
/// SERIALIZATION HELPERS
|
||||
|
||||
String dateTimeRangeToString(DateTimeRange dateTimeRange) {
|
||||
final startStr = dateTimeRange.start.millisecondsSinceEpoch.toString();
|
||||
final endStr = dateTimeRange.end.millisecondsSinceEpoch.toString();
|
||||
return '$startStr|$endStr';
|
||||
}
|
||||
|
||||
String placeToString(FFPlace place) => jsonEncode({
|
||||
'latLng': place.latLng.serialize(),
|
||||
'name': place.name,
|
||||
'address': place.address,
|
||||
'city': place.city,
|
||||
'state': place.state,
|
||||
'country': place.country,
|
||||
'zipCode': place.zipCode,
|
||||
});
|
||||
|
||||
String uploadedFileToString(FFUploadedFile uploadedFile) =>
|
||||
uploadedFile.serialize();
|
||||
|
||||
String? serializeParam(
|
||||
dynamic param,
|
||||
ParamType paramType, [
|
||||
bool isList = false,
|
||||
]) {
|
||||
try {
|
||||
if (param == null) {
|
||||
return null;
|
||||
}
|
||||
if (isList) {
|
||||
final serializedValues = (param as Iterable)
|
||||
.map((p) => serializeParam(p, paramType, false))
|
||||
.where((p) => p != null)
|
||||
.map((p) => p!)
|
||||
.toList();
|
||||
return json.encode(serializedValues);
|
||||
}
|
||||
switch (paramType) {
|
||||
case ParamType.int:
|
||||
return param.toString();
|
||||
case ParamType.double:
|
||||
return param.toString();
|
||||
case ParamType.String:
|
||||
return param;
|
||||
case ParamType.bool:
|
||||
return param ? 'true' : 'false';
|
||||
case ParamType.DateTime:
|
||||
return (param as DateTime).millisecondsSinceEpoch.toString();
|
||||
case ParamType.DateTimeRange:
|
||||
return dateTimeRangeToString(param as DateTimeRange);
|
||||
case ParamType.LatLng:
|
||||
return (param as LatLng).serialize();
|
||||
case ParamType.Color:
|
||||
return (param as Color).toCssString();
|
||||
case ParamType.FFPlace:
|
||||
return placeToString(param as FFPlace);
|
||||
case ParamType.FFUploadedFile:
|
||||
return uploadedFileToString(param as FFUploadedFile);
|
||||
case ParamType.JSON:
|
||||
return json.encode(param);
|
||||
|
||||
case ParamType.Enum:
|
||||
return (param is Enum) ? param.serialize() : null;
|
||||
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
} catch (e) {
|
||||
print('Error serializing parameter: $e');
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/// END SERIALIZATION HELPERS
|
||||
|
||||
/// DESERIALIZATION HELPERS
|
||||
|
||||
DateTimeRange? dateTimeRangeFromString(String dateTimeRangeStr) {
|
||||
final pieces = dateTimeRangeStr.split('|');
|
||||
if (pieces.length != 2) {
|
||||
return null;
|
||||
}
|
||||
return DateTimeRange(
|
||||
start: DateTime.fromMillisecondsSinceEpoch(int.parse(pieces.first)),
|
||||
end: DateTime.fromMillisecondsSinceEpoch(int.parse(pieces.last)),
|
||||
);
|
||||
}
|
||||
|
||||
LatLng? latLngFromString(String latLngStr) {
|
||||
final pieces = latLngStr.split(',');
|
||||
if (pieces.length != 2) {
|
||||
return null;
|
||||
}
|
||||
return LatLng(
|
||||
double.parse(pieces.first.trim()),
|
||||
double.parse(pieces.last.trim()),
|
||||
);
|
||||
}
|
||||
|
||||
FFPlace placeFromString(String placeStr) {
|
||||
final serializedData = jsonDecode(placeStr) as Map<String, dynamic>;
|
||||
final data = {
|
||||
'latLng': serializedData.containsKey('latLng')
|
||||
? latLngFromString(serializedData['latLng'] as String)
|
||||
: const LatLng(0.0, 0.0),
|
||||
'name': serializedData['name'] ?? '',
|
||||
'address': serializedData['address'] ?? '',
|
||||
'city': serializedData['city'] ?? '',
|
||||
'state': serializedData['state'] ?? '',
|
||||
'country': serializedData['country'] ?? '',
|
||||
'zipCode': serializedData['zipCode'] ?? '',
|
||||
};
|
||||
return FFPlace(
|
||||
latLng: data['latLng'] as LatLng,
|
||||
name: data['name'] as String,
|
||||
address: data['address'] as String,
|
||||
city: data['city'] as String,
|
||||
state: data['state'] as String,
|
||||
country: data['country'] as String,
|
||||
zipCode: data['zipCode'] as String,
|
||||
);
|
||||
}
|
||||
|
||||
FFUploadedFile uploadedFileFromString(String uploadedFileStr) =>
|
||||
FFUploadedFile.deserialize(uploadedFileStr);
|
||||
|
||||
enum ParamType {
|
||||
int,
|
||||
double,
|
||||
String,
|
||||
bool,
|
||||
DateTime,
|
||||
DateTimeRange,
|
||||
LatLng,
|
||||
Color,
|
||||
FFPlace,
|
||||
FFUploadedFile,
|
||||
JSON,
|
||||
Enum,
|
||||
}
|
||||
|
||||
dynamic deserializeParam<T>(
|
||||
String? param,
|
||||
ParamType paramType,
|
||||
bool isList,
|
||||
) {
|
||||
try {
|
||||
if (param == null) {
|
||||
return null;
|
||||
}
|
||||
if (isList) {
|
||||
final paramValues = json.decode(param);
|
||||
if (paramValues is! Iterable || paramValues.isEmpty) {
|
||||
return null;
|
||||
}
|
||||
return paramValues
|
||||
.where((p) => p is String)
|
||||
.map((p) => p as String)
|
||||
.map((p) => deserializeParam<T>(p, paramType, false))
|
||||
.where((p) => p != null)
|
||||
.map((p) => p! as T)
|
||||
.toList();
|
||||
}
|
||||
switch (paramType) {
|
||||
case ParamType.int:
|
||||
return int.tryParse(param);
|
||||
case ParamType.double:
|
||||
return double.tryParse(param);
|
||||
case ParamType.String:
|
||||
return param;
|
||||
case ParamType.bool:
|
||||
return param == 'true';
|
||||
case ParamType.DateTime:
|
||||
final milliseconds = int.tryParse(param);
|
||||
return milliseconds != null
|
||||
? DateTime.fromMillisecondsSinceEpoch(milliseconds)
|
||||
: null;
|
||||
case ParamType.DateTimeRange:
|
||||
return dateTimeRangeFromString(param);
|
||||
case ParamType.LatLng:
|
||||
return latLngFromString(param);
|
||||
case ParamType.Color:
|
||||
return fromCssColor(param);
|
||||
case ParamType.FFPlace:
|
||||
return placeFromString(param);
|
||||
case ParamType.FFUploadedFile:
|
||||
return uploadedFileFromString(param);
|
||||
case ParamType.JSON:
|
||||
return json.decode(param);
|
||||
|
||||
case ParamType.Enum:
|
||||
return deserializeEnum<T>(param);
|
||||
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
} catch (e) {
|
||||
print('Error deserializing parameter: $e');
|
||||
return null;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user