MCPcopy Create free account
hub / github.com/erans/pgsqlite / encode_numrange

Method encode_numrange

src/protocol/binary.rs:568–635  ·  view source on GitHub ↗

Encode a numrange value

(range_str: &str)

Source from the content-addressed store, hash-verified

566
567 /// Encode a numrange value
568 pub fn encode_numrange(range_str: &str) -> Result<Vec<u8>, String> {
569 let trimmed = range_str.trim();
570 let mut result = Vec::new();
571
572 // Handle empty range
573 if trimmed == "empty" {
574 result.push(0x01); // RANGE_EMPTY flag
575 return Ok(result);
576 }
577
578 // Parse range format
579 if trimmed.len() < 3 {
580 return Err("Invalid range format".to_string());
581 }
582
583 let lower_inclusive = trimmed.starts_with('[');
584 let upper_inclusive = trimmed.ends_with(']');
585
586 let inner = &trimmed[1..trimmed.len()-1];
587 let parts: Vec<&str> = inner.split(',').collect();
588
589 if parts.len() != 2 {
590 return Err("Invalid range format: expected two bounds".to_string());
591 }
592
593 let lower_str = parts[0].trim();
594 let upper_str = parts[1].trim();
595
596 // Calculate flags
597 let mut flags = 0u8;
598 if lower_inclusive {
599 flags |= 0x02; // LB_INC
600 }
601 if upper_inclusive {
602 flags |= 0x04; // UB_INC
603 }
604
605 let lower_infinite = lower_str == "-infinity" || lower_str.is_empty();
606 let upper_infinite = upper_str == "infinity" || upper_str.is_empty();
607
608 if lower_infinite {
609 flags |= 0x08; // LB_INF
610 }
611 if upper_infinite {
612 flags |= 0x10; // UB_INF
613 }
614
615 result.push(flags);
616
617 // Encode numeric bounds using DecimalHandler
618 if !lower_infinite {
619 let lower_decimal = Decimal::from_str(lower_str)
620 .map_err(|e| format!("Invalid lower bound: {e}"))?;
621 let lower_bytes = DecimalHandler::encode_numeric(&lower_decimal);
622 result.extend_from_slice(&(lower_bytes.len() as i32).to_be_bytes());
623 result.extend_from_slice(&lower_bytes);
624 }
625

Callers

nothing calls this directly

Calls 2

lenMethod · 0.45
is_emptyMethod · 0.45

Tested by

no test coverage detected