Skip to content

Commit d847888

Browse files
committed
Add typedValue extension for Object types.
1 parent a21d713 commit d847888

File tree

1 file changed

+44
-0
lines changed

1 file changed

+44
-0
lines changed

lib/src/api/extensions.dart

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ extension StringExtensions on String {
2828
}
2929
} else if (R == List) {
3030
try {
31+
if (!value.startsWith('[') || !value.endsWith(']')) return null;
3132
return value
3233
.substring(1, value.length - 1)
3334
.split(',')
@@ -59,3 +60,46 @@ extension StringExtensions on String {
5960
});
6061
}
6162
}
63+
64+
/// Declares extensions on [Object].
65+
extension ObjectExt on Object? {
66+
/// Converts given string to a typed value if possible.
67+
/// Returns [defaultValue] or null otherwise.
68+
R? typedValue<R>({R? defaultValue}) {
69+
final value = this;
70+
if (value is R) return value;
71+
72+
if (R == String) {
73+
return value as R;
74+
} else if (R == int) {
75+
return (int.tryParse('$value') ?? defaultValue) as R?;
76+
} else if (R == double) {
77+
return (double.tryParse('$value') ?? defaultValue) as R;
78+
} else if (R == num) {
79+
return (num.tryParse('$value') ?? defaultValue) as R;
80+
} else if (R == bool) {
81+
final boolValue = bool.tryParse('$value', caseSensitive: false);
82+
if (boolValue == null) return defaultValue;
83+
return (boolValue || value == '1') as R;
84+
} else if (R == Map) {
85+
try {
86+
return jsonDecode('$value') as R?;
87+
} catch (e) {
88+
return defaultValue;
89+
}
90+
} else if (R == List) {
91+
try {
92+
if (!'$value'.startsWith('[') || !'$value'.endsWith(']')) return null;
93+
return '$value'
94+
.substring(1, '$value'.length - 1)
95+
.split(',')
96+
.map((e) => e.trim().parsedValue())
97+
.toList() as R?;
98+
} catch (e) {
99+
return defaultValue;
100+
}
101+
} else {
102+
return value as R?;
103+
}
104+
}
105+
}

0 commit comments

Comments
 (0)