summaryrefslogtreecommitdiff
path: root/src/ion.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/ion.rs')
-rw-r--r--src/ion.rs55
1 files changed, 52 insertions, 3 deletions
diff --git a/src/ion.rs b/src/ion.rs
index 65f5d23..26b54b9 100644
--- a/src/ion.rs
+++ b/src/ion.rs
@@ -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)
}
}