1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
//! WebSocket JSON messages parsing utilities.
//! TODO: This is too inconsistent API,
//!       before implementing BitFinex.

use std::str::FromStr;
use std::convert::From;
use serde_json::Value;
use serde_json::value::Index;

use super::OptionExt;
use super::errors::*;

#[inline]
pub fn get_array<'a, I: Index>(event: &'a Value, index: I) -> Result<&'a Vec<Value>> {
    let event = event.get(index).into_result()?;
    let event = event.as_array().into_result()?;
    Ok(event)
}

#[inline]
pub fn get_object<'a>(
    objects: &'a Vec<Value>,
    index: usize,
) -> Result<&'a ::serde_json::Map<String, Value>> {
    let object = objects.get(index).into_result()?;
    let object = object.as_object().into_result()?;
    Ok(object)
}

#[inline]
pub fn get_i64<I: Index>(event: &Value, index: I) -> Result<i64> {
    let event = event.get(index).into_result()?;
    let event = event.as_i64().into_result()?;
    Ok(event)
}

#[inline]
pub fn get_str<'a, I: Index>(event: &'a Value, index: I) -> Result<&'a str> {
    let event = event.get(index).into_result()?;
    let event = event.as_str().into_result()?;
    Ok(event)
}

#[inline]
pub fn parse_nth_str<T: FromStr>(event: &Value, index: usize) -> Result<T>
where
    Error: From<<T as FromStr>::Err>,
{
    match event.get(index) {
        Some(value) => parse_str::<T>(value),
        None => Err(ErrorKind::EmptyOption.into()),
    }
}

#[inline]
pub fn parse_str<T: FromStr>(value: &Value) -> Result<T>
where
    Error: From<<T as FromStr>::Err>,
{
    match value.as_str() {
        Some(value) => value.parse::<T>().map_err(|e| e.into()),
        None => Err(ErrorKind::EmptyOption.into()),
    }
}