Trait ion_c_sys::reader::IonCReader[][src]

pub trait IonCReader {
    fn next(&mut self) -> IonCResult<ION_TYPE>;
fn get_type(&self) -> IonCResult<ION_TYPE>;
fn step_in(&mut self) -> IonCResult<()>;
fn step_out(&mut self) -> IonCResult<()>;
fn depth(&self) -> IonCResult<i32>;
fn is_null(&self) -> IonCResult<bool>;
fn is_in_struct(&self) -> IonCResult<bool>;
fn get_field_name(&mut self) -> IonCResult<StrSliceRef<'_>>;
fn get_annotations(&mut self) -> IonCResult<StrSlicesRef<'_>>;
fn read_bool(&mut self) -> IonCResult<bool>;
fn read_i64(&mut self) -> IonCResult<i64>;
fn read_bigint(&mut self) -> IonCResult<BigInt>;
fn read_f64(&mut self) -> IonCResult<f64>;
fn read_bigdecimal(&mut self) -> IonCResult<BigDecimal>;
fn read_datetime(&mut self) -> IonCResult<IonDateTime>;
fn read_string(&mut self) -> IonCResult<StrSliceRef<'_>>;
fn read_bytes(&mut self) -> IonCResult<Vec<u8>>; }

The reading API for Ion C.

See also IonCReaderHandle.

Usage

let mut reader = IonCReaderHandle::try_from(b"\xE0\x01\x00\xEA\x85hello".as_ref())?;
let tid = reader.next()?;
assert_eq!(ION_TYPE_STRING, tid);
// reader_handle implements Drop, so we're good to go!

Required methods

fn next(&mut self) -> IonCResult<ION_TYPE>[src]

Advances the reader to the next value and returns the type.

fn get_type(&self) -> IonCResult<ION_TYPE>[src]

Returns the type of the current position.

Usage

let mut reader = IonCReaderHandle::try_from("'''hello!'''")?;
assert_eq!(ION_TYPE_NONE, reader.get_type()?);
assert_eq!(ION_TYPE_STRING, reader.next()?);
assert_eq!(ION_TYPE_STRING, reader.get_type()?);
assert_eq!(ION_TYPE_EOF, reader.next()?);
assert_eq!(ION_TYPE_EOF, reader.get_type()?);

fn step_in(&mut self) -> IonCResult<()>[src]

Steps in to the current container.

fn step_out(&mut self) -> IonCResult<()>[src]

Steps out of the current container.

fn depth(&self) -> IonCResult<i32>[src]

Returns the current container depth.

Usage

let mut reader = IonCReaderHandle::try_from("[[]]")?;
assert_eq!(ION_TYPE_LIST, reader.next()?);
reader.step_in()?;
assert_eq!(1, reader.depth()?);
assert_eq!(ION_TYPE_LIST, reader.next()?);
reader.step_in()?;
assert_eq!(2, reader.depth()?);

fn is_null(&self) -> IonCResult<bool>[src]

Returns if the reader is positioned on a null value.

Usage

let mut reader = IonCReaderHandle::try_from("null.int 4")?;
assert_eq!(ION_TYPE_INT, reader.next()?);
assert!(reader.is_null()?);
assert_eq!(ION_TYPE_INT, reader.next()?);
assert!(!reader.is_null()?);

fn is_in_struct(&self) -> IonCResult<bool>[src]

Returns if the reader is positioned within a struct value.

Usage

let mut reader = IonCReaderHandle::try_from("{}")?;
assert_eq!(ION_TYPE_STRUCT, reader.next()?);
assert!(!reader.is_in_struct()?);
reader.step_in()?;
assert!(reader.is_in_struct()?);

fn get_field_name(&mut self) -> IonCResult<StrSliceRef<'_>>[src]

Returns the field name if the reader positioned within a structure.

Usage

let mut reader = IonCReaderHandle::try_from("{a:5}")?;
assert_eq!(ION_TYPE_STRUCT, reader.next()?);
reader.step_in()?;
assert_eq!(ION_TYPE_INT, reader.next()?);
assert_eq!("a", reader.get_field_name()?.as_str());

fn get_annotations(&mut self) -> IonCResult<StrSlicesRef<'_>>[src]

Retrieves the annotations associated with the current value.

Note that this allocates a vector on the heap for the IonCStringRef instances. If this is not desired, use the low-level annotation functions.

Usage

let mut reader = IonCReaderHandle::try_from("ab::cde::fghi::5")?;
assert_eq!(ION_TYPE_INT, reader.next()?);
let annotations = reader.get_annotations()?;
assert_eq!(
    vec!["ab", "cde", "fghi"].as_slice(),
    annotations.as_ref()
);

fn read_bool(&mut self) -> IonCResult<bool>[src]

Reads a bool value from the reader.

Usage

let mut reader = IonCReaderHandle::try_from("true")?;
assert_eq!(ION_TYPE_BOOL, reader.next()?);
assert!(reader.read_bool()?);

fn read_i64(&mut self) -> IonCResult<i64>[src]

Reads an int value from the reader.

Usage

let mut reader = IonCReaderHandle::try_from("42")?;
assert_eq!(ION_TYPE_INT, reader.next()?);
assert_eq!(42, reader.read_i64()?);

fn read_bigint(&mut self) -> IonCResult<BigInt>[src]

Reads an int value from the reader as a BigInt.

Usage

let mut reader = IonCReaderHandle::try_from("0x5195a4b154400e07dee3a7378c403b2d5dd6dd58735")?;
assert_eq!(ION_TYPE_INT, reader.next()?);
assert_eq!(
  BigInt::parse_bytes(b"1907775120294590714755986204580814176547217067050805", 10).unwrap(),
  reader.read_bigint()?
);

fn read_f64(&mut self) -> IonCResult<f64>[src]

Reads a float value from the reader.

Usage

let mut reader = IonCReaderHandle::try_from("3.0e0")?;
assert_eq!(ION_TYPE_FLOAT, reader.next()?);
assert_eq!(3.0, reader.read_f64()?);

fn read_bigdecimal(&mut self) -> IonCResult<BigDecimal>[src]

Reads a bigdecimal value from the reader.

Usage

let mut reader = IonCReaderHandle::try_from("3.0")?;
assert_eq!(ION_TYPE_DECIMAL, reader.next()?);
let value = BigDecimal::parse_bytes(b"30E-1", 10).unwrap();
assert_eq!(value, reader.read_bigdecimal()?);

fn read_datetime(&mut self) -> IonCResult<IonDateTime>[src]

Reads a timestamp value from the reader.

Usage

let mut reader = IonCReaderHandle::try_from("2020-10-10T12:34:45.123-00:00")?;
assert_eq!(ION_TYPE_TIMESTAMP, reader.next()?);
let ion_dt = reader.read_datetime()?;

// the point in time should be the same
let expected_dt = DateTime::parse_from_rfc3339("2020-10-10T12:34:45.123Z").unwrap();
assert_eq!(&expected_dt, ion_dt.as_datetime());

// precision should be millisecond level
if let Fractional(Digits(digits)) = ion_dt.precision() {
    assert_eq!(3, *digits);
} else {
    assert!(false, "Expected digits precision!");
}

// we should have an unknown offset
assert_eq!(UnknownOffset, ion_dt.offset_kind());

fn read_string(&mut self) -> IonCResult<StrSliceRef<'_>>[src]

Reads a string/symbol value from the reader.

Usage

let mut reader = IonCReaderHandle::try_from("\"🦄\" '✨'")?;
assert_eq!(ION_TYPE_STRING, reader.next()?);
assert_eq!("🦄", reader.read_string()?.as_str());
assert_eq!(ION_TYPE_SYMBOL, reader.next()?);
assert_eq!("✨", reader.read_string()?.as_str());

fn read_bytes(&mut self) -> IonCResult<Vec<u8>>[src]

Reads a clob/blob value from the reader.

This method implements a vector on the heap to store a copy of the LOB. If this is not desired, use the low-level length and read methods directly.

Usage

let mut reader = IonCReaderHandle::try_from("{{\"hello\"}} {{d29ybGQ=}}")?;
assert_eq!(ION_TYPE_CLOB, reader.next()?);
assert_eq!(b"hello", reader.read_bytes()?.as_slice());
assert_eq!(ION_TYPE_BLOB, reader.next()?);
assert_eq!(b"world", reader.read_bytes()?.as_slice());
Loading content...

Implementors

Loading content...