server/src/server.rs

70 lines
1.8 KiB
Rust

use crate::{error::Result, users::User};
use indradb::{
Datastore, EdgeKey, Identifier, MemoryDatastore, SpecificEdgeQuery, SpecificVertexQuery,
Vertex, VertexPropertyQuery, VertexQuery, VertexQueryExt,
};
// Create an in-memory datastore
// Create a couple of vertices
pub struct Server<T>
where
T: Datastore,
{
pub datastore: T,
}
impl Server<MemoryDatastore> {
pub fn memory() -> Self {
Self {
datastore: MemoryDatastore::default(),
}
}
}
impl<T: Datastore + Clone> Server<T> {
pub fn create_user(&self, external_id: Option<String>) -> Result<User<T>> {
let v = Vertex::new(Identifier::new("user")?);
self.datastore.create_vertex(&v)?;
self.datastore.set_vertex_properties(
SpecificVertexQuery::single(v.id).property(Identifier::new("external_id")?),
external_id.clone().into(),
)?;
Ok(User {
id: v.id,
external_id,
datastore: self.datastore.clone(),
})
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_server() -> Result<()> {
let server = Server::memory();
let out_v = Vertex::new(Identifier::new("person")?);
let in_v = Vertex::new(Identifier::new("movie")?);
server.datastore.create_vertex(&out_v)?;
server.datastore.create_vertex(&in_v)?;
// Add an edge between the vertices
let key = EdgeKey::new(out_v.id, Identifier::new("likes")?, in_v.id);
server.datastore.create_edge(&key)?;
// Query for the edge
let e = server
.datastore
.get_edges(SpecificEdgeQuery::single(key.clone()).into())?;
assert_eq!(e.len(), 1);
assert_eq!(key, e[0].key);
Ok(())
}
}