diff options
Diffstat (limited to 'src/ion.rs')
-rw-r--r-- | src/ion.rs | 55 |
1 files changed, 52 insertions, 3 deletions
@@ -81,7 +81,6 @@ impl IonValue { } pub fn len(&self) -> usize { - // TODO: Should this read the type length? self.0.len() } @@ -116,15 +115,65 @@ impl IonValue { self.reader().next_symbol_id() } + pub fn get_field(&self, field_id: usize) -> Option<IonValue> { + let mut reader = self.reader(); + reader.step_in(); + while reader.offset() < self.len() { + let value = reader.next_value(); + if Some(field_id) == reader.field_id() { + return Some(value); + } + } + None + } } impl From<Vec<u8>> for IonValue { fn from(value: Vec<u8>) -> Self { - if value.len() > 0 { + if value.is_empty() { + IonValue(vec![0x0F]) + } else { IonValue(value) + } + } +} + +impl From<Vec<(usize, IonValue)>> for IonValue { + fn from(values: Vec<(usize, IonValue)>) -> Self { + let mut buf = Vec::new(); + for (k, v) in values { + push_varuint(&mut buf, k); + buf.extend(v.0); + } + let len = buf.len(); + if len < 14 { + buf.insert(0, 0xD0 | len as u8); } else { - IonValue(vec![0x0F]) + let oldbuf = buf; + buf = Vec::with_capacity(oldbuf.len() + 9); + buf.push(0xDE); + push_varuint(&mut buf, len); + buf.extend(oldbuf); + } + IonValue(buf) + } +} + +impl From<Vec<IonValue>> for IonValue { + fn from(values: Vec<IonValue>) -> Self { + let len: usize = values.iter().map(|v| v.len()).sum(); + let lenlen = ((usize::BITS - len.leading_zeros() + 6) / 7) as usize; + let mut buf = Vec::with_capacity(1 + len + lenlen); + if len < 14 { + buf.push(0xB0 | len as u8); + } else { + buf.push(0xBE); + push_varuint(&mut buf, len); } + for v in values { + buf.extend(v.0); + } + IonValue(buf) } } |