toParamValue function
Converts a single object to a ParamValue instance.
Supported implicit input types:
null→ParamValueNullParamValue→ returned as-isint→ParamValueInt32orParamValueInt64(based on range)String→ParamValueStringList<int>orUint8List→ParamValueBinarybool→ParamValueInt32(1|0)(canonical mapping)double→ParamValueDecimal(value.toString())(canonical mapping)DateTime→ParamValueString(value.toUtc().toIso8601String())(canonical mapping)
Throws ArgumentError for unsupported types with actionable message.
Example:
final pv = toParamValue(42); // ParamValueInt32(42)
final pvNull = toParamValue(null); // ParamValueNull
final pvBool = toParamValue(true); // ParamValueInt32(1)
Implementation
ParamValue toParamValue(Object? value) {
if (value == null) return const ParamValueNull();
if (value is ParamValue) return value;
// Fast path for int - most common case
if (value is int) {
if (value >= -0x80000000 && value <= 0x7FFFFFFF) {
return ParamValueInt32(value);
}
return ParamValueInt64(value);
}
// String - common case
if (value is String) return ParamValueString(value);
// Binary data
if (value is List<int>) return ParamValueBinary(value);
// Canonical mappings - explicit conversions with clear semantics
if (value is bool) {
return ParamValueInt32(value ? 1 : 0);
}
if (value is double) {
return ParamValueDecimal(value.toString());
}
if (value is DateTime) {
return ParamValueString(value.toUtc().toIso8601String());
}
// Unsupported type - explicit error instead of silent toString() fallback
throw ArgumentError(
'Unsupported parameter type: ${value.runtimeType}. '
'Expected one of: null, int, String, List<int>, bool, double, DateTime, '
'or ParamValue. '
'Use explicit ParamValue wrapper if needed, e.g., '
'ParamValueString(value) for custom string conversion.',
);
}