| 43 | } |
| 44 | |
| 45 | fn decode_hex_to_writer<W: Write>(hex_string: &str, writer: &mut W) -> Result<(), ArrowError> { |
| 46 | let bytes = hex_string.as_bytes(); |
| 47 | let mut iter = bytes.chunks_exact(2); |
| 48 | let mut buffer = [0u8; 64]; |
| 49 | let mut buffered = 0; |
| 50 | |
| 51 | for (pair_index, pair) in (&mut iter).enumerate() { |
| 52 | let base = pair_index * 2; |
| 53 | let high = decode_hex_digit(pair[0]).ok_or_else(|| invalid_hex_error_at(base, pair[0]))?; |
| 54 | let low = |
| 55 | decode_hex_digit(pair[1]).ok_or_else(|| invalid_hex_error_at(base + 1, pair[1]))?; |
| 56 | buffer[buffered] = (high << 4) | low; |
| 57 | buffered += 1; |
| 58 | |
| 59 | if buffered == buffer.len() { |
| 60 | writer |
| 61 | .write_all(&buffer) |
| 62 | .map_err(|e| ArrowError::JsonError(format!("failed to write binary data: {e}")))?; |
| 63 | buffered = 0; |
| 64 | } |
| 65 | } |
| 66 | |
| 67 | let remainder = iter.remainder(); |
| 68 | if !remainder.is_empty() { |
| 69 | let index = (bytes.len() / 2) * 2; |
| 70 | let low = decode_hex_digit(remainder[0]) |
| 71 | .ok_or_else(|| invalid_hex_error_at(index, remainder[0]))?; |
| 72 | buffer[buffered] = low; |
| 73 | buffered += 1; |
| 74 | } |
| 75 | |
| 76 | if buffered > 0 { |
| 77 | writer |
| 78 | .write_all(&buffer[..buffered]) |
| 79 | .map_err(|e| ArrowError::JsonError(format!("failed to write binary data: {e}")))?; |
| 80 | } |
| 81 | |
| 82 | Ok(()) |
| 83 | } |
| 84 | |
| 85 | #[derive(Default)] |
| 86 | pub struct BinaryArrayDecoder<O: OffsetSizeTrait> { |