toParamValue function

ParamValue toParamValue(
  1. Object? value
)

Converts a single object to a ParamValue instance.

Supported implicit input types:

  • nullParamValueNull
  • ParamValue → returned as-is
  • intParamValueInt32 or ParamValueInt64 (based on range)
  • StringParamValueString
  • List<int> or Uint8ListParamValueBinary
  • boolParamValueInt32(1|0) (canonical mapping)
  • doubleParamValueDecimal(value.toString()) (canonical mapping)
  • DateTimeParamValueString(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.',
  );
}