Initial commit
This commit is contained in:
commit
ad203cd470
|
@ -0,0 +1,2 @@
|
||||||
|
/target
|
||||||
|
/Cargo.lock
|
|
@ -0,0 +1,11 @@
|
||||||
|
[package]
|
||||||
|
name = "aegis"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
indradb-lib = { version = "*", features = ["rocksdb-datastore"] }
|
||||||
|
uuid = { version = "1.1.2", features = [ "v4" ] }
|
||||||
|
|
|
@ -0,0 +1,51 @@
|
||||||
|
use std::fmt::Display;
|
||||||
|
|
||||||
|
pub type Result<T> = std::result::Result<T, Error>;
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub enum ErrorKind {
|
||||||
|
Internal,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub struct Error {
|
||||||
|
kind: ErrorKind,
|
||||||
|
code: u16,
|
||||||
|
message: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Display for Error {
|
||||||
|
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||||
|
write!(f, "{}", self.message)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Error {
|
||||||
|
pub fn internal(code: u16, s: &str) -> Self {
|
||||||
|
Self {
|
||||||
|
kind: ErrorKind::Internal,
|
||||||
|
code,
|
||||||
|
message: s.to_string(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<indradb::Error> for Error {
|
||||||
|
fn from(source: indradb::Error) -> Self {
|
||||||
|
Self {
|
||||||
|
kind: ErrorKind::Internal,
|
||||||
|
code: 0,
|
||||||
|
message: format!("{}", source),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<indradb::ValidationError> for Error {
|
||||||
|
fn from(source: indradb::ValidationError) -> Self {
|
||||||
|
Self {
|
||||||
|
kind: ErrorKind::Internal,
|
||||||
|
code: 1,
|
||||||
|
message: format!("{}", source),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,12 @@
|
||||||
|
mod error;
|
||||||
|
mod resources;
|
||||||
|
mod server;
|
||||||
|
mod users;
|
||||||
|
|
||||||
|
pub use error::{Error, Result};
|
||||||
|
pub use server::Server;
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
}
|
|
@ -0,0 +1,10 @@
|
||||||
|
pub struct Resource {
|
||||||
|
resource_type: String,
|
||||||
|
name: String,
|
||||||
|
external_id: Option<String>,
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct Group {
|
||||||
|
name: String,
|
||||||
|
external_id: Option<String>,
|
||||||
|
}
|
|
@ -0,0 +1,69 @@
|
||||||
|
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(())
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,20 @@
|
||||||
|
use indradb::Datastore;
|
||||||
|
use uuid::Uuid;
|
||||||
|
|
||||||
|
#[derive(Clone)]
|
||||||
|
pub struct User<T>
|
||||||
|
where
|
||||||
|
T: Datastore,
|
||||||
|
{
|
||||||
|
pub datastore: T,
|
||||||
|
pub id: Uuid,
|
||||||
|
pub external_id: Option<String>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T: Datastore> User<T> {
|
||||||
|
pub fn property(&self, key: String) -> String {}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct Team {
|
||||||
|
external_id: Option<String>,
|
||||||
|
}
|
Loading…
Reference in New Issue