Encode an int8range value
(range_str: &str)
| 496 | |
| 497 | /// Encode an int8range value |
| 498 | pub fn encode_int8range(range_str: &str) -> Result<Vec<u8>, String> { |
| 499 | let trimmed = range_str.trim(); |
| 500 | let mut result = Vec::new(); |
| 501 | |
| 502 | // Handle empty range |
| 503 | if trimmed == "empty" { |
| 504 | result.push(0x01); // RANGE_EMPTY flag |
| 505 | return Ok(result); |
| 506 | } |
| 507 | |
| 508 | // Parse range format |
| 509 | if trimmed.len() < 3 { |
| 510 | return Err("Invalid range format".to_string()); |
| 511 | } |
| 512 | |
| 513 | let lower_inclusive = trimmed.starts_with('['); |
| 514 | let upper_inclusive = trimmed.ends_with(']'); |
| 515 | |
| 516 | let inner = &trimmed[1..trimmed.len()-1]; |
| 517 | let parts: Vec<&str> = inner.split(',').collect(); |
| 518 | |
| 519 | if parts.len() != 2 { |
| 520 | return Err("Invalid range format: expected two bounds".to_string()); |
| 521 | } |
| 522 | |
| 523 | let lower_str = parts[0].trim(); |
| 524 | let upper_str = parts[1].trim(); |
| 525 | |
| 526 | // Calculate flags |
| 527 | let mut flags = 0u8; |
| 528 | if lower_inclusive { |
| 529 | flags |= 0x02; // LB_INC |
| 530 | } |
| 531 | if upper_inclusive { |
| 532 | flags |= 0x04; // UB_INC |
| 533 | } |
| 534 | |
| 535 | let lower_infinite = lower_str == "-infinity" || lower_str.is_empty(); |
| 536 | let upper_infinite = upper_str == "infinity" || upper_str.is_empty(); |
| 537 | |
| 538 | if lower_infinite { |
| 539 | flags |= 0x08; // LB_INF |
| 540 | } |
| 541 | if upper_infinite { |
| 542 | flags |= 0x10; // UB_INF |
| 543 | } |
| 544 | |
| 545 | result.push(flags); |
| 546 | |
| 547 | // Encode bounds |
| 548 | if !lower_infinite { |
| 549 | let lower_val: i64 = lower_str.parse() |
| 550 | .map_err(|_| format!("Invalid lower bound: {lower_str}"))?; |
| 551 | let lower_bytes = lower_val.to_be_bytes(); |
| 552 | result.extend_from_slice(&(lower_bytes.len() as i32).to_be_bytes()); |
| 553 | result.extend_from_slice(&lower_bytes); |
| 554 | } |
| 555 |