wasmcloud-redisgraph 0.3.3

RedisGraph implementation of the wasmCloud Graph Database capability provider contract
use redisgraph::result_set::{Column::*, Scalar};
use std::collections::HashMap;
use wasmcloud_actor_graphdb::generated::Column;

pub(crate) fn redisgraph_column_to_common(
    rc: redisgraph::result_set::Column,
) -> wasmcloud_actor_graphdb::generated::Column {
    match rc {
        Scalars(s) => {
            let scalars = Some(
                s.into_iter()
                    .map(redisgraph_scalar_to_common)
                    .collect::<Vec<_>>(),
            );
            Column {
                scalars,
                ..Default::default()
            }
        }
        Nodes(n) => {
            let nodes = Some(
                n.into_iter()
                    .map(redisgraph_node_to_common)
                    .collect::<Vec<_>>(),
            );
            Column {
                nodes,
                ..Default::default()
            }
        }
        Relations(r) => {
            let relations = Some(
                r.into_iter()
                    .map(redisgraph_relation_to_common)
                    .collect::<Vec<_>>(),
            );
            Column {
                relations,
                ..Default::default()
            }
        }
    }
}

pub(crate) fn redisgraph_scalar_to_common(
    rs: redisgraph::result_set::Scalar,
) -> wasmcloud_actor_graphdb::generated::Scalar {
    let mut scalar = wasmcloud_actor_graphdb::generated::Scalar::default();
    match rs {
        Scalar::Boolean(b) => scalar.bool_value = Some(b),
        Scalar::Double(d) => scalar.double_value = Some(d),
        Scalar::Integer(i) => scalar.int_value = Some(i),
        Scalar::String(s) => scalar.string_value = Some(redisstring_to_string(s)),
        Scalar::Nil => (),
    };
    scalar
}

pub(crate) fn redisgraph_node_to_common(
    rn: redisgraph::result_set::Node,
) -> wasmcloud_actor_graphdb::generated::Node {
    let labels = rn
        .labels
        .into_iter()
        .map(redisstring_to_string)
        .collect::<Vec<_>>();
    let properties = rn
        .properties
        .into_iter()
        .map(|(k, v)| (redisstring_to_string(k), redisgraph_scalar_to_common(v)))
        .collect::<HashMap<_, _>>();
    wasmcloud_actor_graphdb::generated::Node { labels, properties }
}

pub(crate) fn redisgraph_relation_to_common(
    rr: redisgraph::result_set::Relation,
) -> wasmcloud_actor_graphdb::generated::Relation {
    let type_name = redisstring_to_string(rr.type_name);
    let properties = rr
        .properties
        .into_iter()
        .map(|(k, v)| (redisstring_to_string(k), redisgraph_scalar_to_common(v)))
        .collect::<HashMap<_, _>>();
    wasmcloud_actor_graphdb::generated::Relation {
        type_name,
        properties,
    }
}

fn redisstring_to_string(rs: redisgraph::RedisString) -> String {
    String::from_utf8(rs.into()).unwrap()
}