Scalar.fromArrow constructor
- DType dtype,
- 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}',
),
};
}