Skip to content

Commit

Permalink
bcf/record/info/field/value: Add character array decoder
Browse files Browse the repository at this point in the history
  • Loading branch information
zaeleus committed May 25, 2024
1 parent eb89012 commit 052db76
Showing 1 changed file with 50 additions and 1 deletion.
51 changes: 50 additions & 1 deletion noodles-bcf/src/record/codec/decoder/samples/values.rs
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,9 @@ pub(super) fn read_values(
(_, format::Type::Integer, Type::Int16(n)) => read_i16_array_values(src, sample_count, n),
(_, format::Type::Integer, Type::Int32(n)) => read_i32_array_values(src, sample_count, n),
(_, format::Type::Float, Type::Float(n)) => read_f32_array_values(src, sample_count, n),
(_, format::Type::Character, Type::String(_)) => todo!(),
(_, format::Type::Character, Type::String(n)) => {
read_char_array_values(src, sample_count, n)
}
(_, format::Type::String, Type::String(n)) => {
read_string_array_values(src, sample_count, n)
}
Expand Down Expand Up @@ -307,6 +309,34 @@ fn read_char_values(
Ok(values)
}

fn read_char_array_values(
src: &mut &[u8],
sample_count: usize,
len: usize,
) -> Result<Vec<Option<Value>>, DecodeError> {
const DELIMITER: char = ',';
const MISSING: char = '.';

let mut values = Vec::with_capacity(sample_count);

for _ in 0..sample_count {
let s = read_string_until_nul(src, len)?;

let value = Value::from(
s.split(DELIMITER)
.map(|t| match t.chars().next().unwrap() {
MISSING => None,
c => Some(c),
})
.collect::<Vec<_>>(),
);

values.push(Some(value));
}

Ok(values)
}

fn read_string_values(
src: &mut &[u8],
sample_count: usize,
Expand Down Expand Up @@ -616,6 +646,25 @@ mod tests {
);
}

#[test]
fn test_read_values_with_character_array_values() {
let mut src = &[
0x37, // Some(Type::String(3))
b'n', b',', b'd', // [Some('n'), Some('d')]
b'n', b',', b'.', // [Some('n'), None]
b'n', 0x00, 0x00, // [Some('n')]
][..];

assert_eq!(
read_values(&mut src, Number::Count(2), format::Type::Character, 3),
Ok(vec![
Some(Value::from(vec![Some('n'), Some('d')])),
Some(Value::from(vec![Some('n'), None])),
Some(Value::from(vec![Some('n')])),
])
);
}

#[test]
fn test_read_values_with_string_values() {
let mut src = &[
Expand Down

0 comments on commit 052db76

Please sign in to comment.