v_individual_model/onto/
parser.rs

1use crate::onto::cbor2individual::{parse_cbor, parse_cbor_to_predicate};
2use crate::onto::individual::*;
3use crate::onto::msgpack2individual::*;
4
5#[derive(Eq, PartialEq, Debug)]
6pub enum RawType {
7    Cbor,
8    Json,
9    Msgpack,
10    Unknown,
11}
12
13pub fn parse_to_predicate(expect_predicate: &str, iraw: &mut Individual) -> bool {
14    if iraw.raw.raw_type == RawType::Msgpack {
15        if let Err(e) = parse_msgpack_to_predicate(expect_predicate, iraw) {
16            if !e.is_empty() {
17                error!("parse for [{}], err={}", expect_predicate, e);
18            }
19            return false;
20        }
21        return true;
22    } else if iraw.raw.raw_type == RawType::Cbor {
23        if let Err(e) = parse_cbor_to_predicate(expect_predicate, iraw) {
24            if !e.is_empty() {
25                error!("parse for [{}], err={}", expect_predicate, e);
26            }
27            return false;
28        }
29        return true;
30    }
31
32    false
33}
34
35const MSGPACK_MAGIC_HEADER: u8 = 146;
36
37pub fn parse_raw(iraw: &mut Individual) -> Result<(), i8> {
38    if iraw.raw.data.is_empty() {
39        return Ok(());
40    }
41
42    // Reset state before parsing
43    iraw.reset();
44
45    let traw: &[u8] = iraw.raw.data.as_slice();
46
47    if traw[0] == MSGPACK_MAGIC_HEADER {
48        iraw.raw.raw_type = RawType::Msgpack;
49    } else {
50        iraw.raw.raw_type = RawType::Cbor;
51    }
52
53    let res = if iraw.raw.raw_type == RawType::Msgpack {
54        parse_msgpack(&mut iraw.raw)
55    } else {
56        parse_cbor(&mut iraw.raw)
57    };
58
59    if let Ok(uri) = res {
60        iraw.obj.uri = uri;
61        return Ok(());
62    }
63
64    Err(-1)
65}