Scalar.fromArrow constructor

Scalar.fromArrow(
  1. DType dtype,
  2. ArrowValue? value
)

Reuses supported primitive Arrow value wrappers without converting through imprecise Dart numbers. Nested, dictionary/category, and extension literals are deliberately unsupported by the native protocol.

Implementation

factory Scalar.fromArrow(DType dtype, ArrowValue? value) {
  if (value == null) return Scalar.nullValue(dtype);
  return switch (value) {
    ArrowBooleanValue(:final value) when dtype is BooleanType =>
      Scalar.boolean(value),
    ArrowIntegerValue(:final value) => Scalar.integer(value, dtype),
    ArrowFloatingValue(:final hexadecimalBits) => Scalar._(dtype, {
      'floatBits': _validateFloatBits(dtype, hexadecimalBits),
    }),
    ArrowDecimalValue(:final unscaled) => Scalar.decimal(
      unscaled,
      dtype as DecimalType,
    ),
    ArrowStringValue(:final value) when dtype is StringType => Scalar.string(
      value,
    ),
    ArrowBinaryValue(:final bytes)
        when dtype is BinaryType || dtype is BinaryOffsetType =>
      Scalar._(dtype, {'base64': base64Encode(bytes)}),
    ArrowTemporalValue(:final value) => switch (dtype) {
      DateType() => Scalar.date(_bigIntToInt(value, 32, 'date value')),
      TimeType() => Scalar.time(_bigIntToInt(value, 64, 'time value')),
      DateTimeType() => Scalar.datetime(value, dtype),
      DurationType() => Scalar.duration(value, dtype),
      _ => throw ArgumentError.value(
        dtype,
        'dtype',
        'does not match Arrow temporal value',
      ),
    },
    ArrowListValue() ||
    ArrowStructValue() ||
    ArrowDictionaryIndexValue() ||
    ArrowExtensionValue() => throw ArgumentError.value(
      value,
      'value',
      'nested, category, and extension literals are unsupported',
    ),
    _ => throw ArgumentError.value(
      dtype,
      'dtype',
      'does not match ${value.runtimeType}',
    ),
  };
}