use crate::converter::Converter;
use crate::errors::WysgyResult;
use crate::fileops::FileOps;
use crate::files::{CONFIG_JSON_CONTENTS, GV_TEMPLATE_CONTENTS};
use crate::node::Node;
use crate::rel::Rel;
use crate::wysgy::Wysgy;
use glob::glob;
use prettytable::Table;
use serde_json::{json, Value};
use std::fs;
use std::io::{BufRead, ErrorKind};
use std::path::PathBuf;
use std::process::{Child, Command};
trait GraphOps
where
Self: std::marker::Sized,
{
fn filter_nodes(&self, kv: Option<Value>) -> WysgyResult<Vec<Node>>;
fn filter_rels(&self, kv: Option<Value>) -> WysgyResult<Vec<Rel>>;
fn add_node(&self, s: String) -> WysgyResult<Node>;
fn del_node(&self, id: String) -> WysgyResult<()>;
fn edit_node(&self, id: String, s: String) -> WysgyResult<Node>;
fn add_rel(&self, s: String, src_id: String, dst_id: String) -> WysgyResult<Rel>;
fn del_rel(&self, id: String) -> WysgyResult<()>;
fn edit_rel(&self, id: String, s: String) -> WysgyResult<Rel>;
}
impl GraphOps for Wysgy {
fn filter_nodes(&self, kv: Option<Value>) -> WysgyResult<Vec<Node>> {
match &kv {
None => self.get_all_nodes(),
Some(t) => Ok(self
.get_all_nodes()
.unwrap()
.into_iter()
.filter(|e| {
t.as_object()
.unwrap()
.iter()
.all(|(k, v)| e.kv[k] == v.clone())
})
.collect::<Vec<Node>>()),
}
}
fn filter_rels(&self, kv: Option<Value>) -> WysgyResult<Vec<Rel>> {
match &kv {
None => self.get_all_rels(),
Some(t) => Ok(self
.get_all_rels()
.unwrap()
.into_iter()
.filter(|e| {
t.as_object()
.unwrap()
.iter()
.all(|(k, v)| e.kv[k] == v.clone())
})
.collect::<Vec<Rel>>()),
}
}
fn add_node(&self, s: String) -> WysgyResult<Node> {
let n = Converter::kv_to_json(&s, "\n");
FileOps::add_node(self)
}
fn del_node(&self, id: String) -> WysgyResult<()> {
FileOps::del_node(id);
}
fn edit_node(&self, id: String, s: String) -> WysgyResult<()> {
FileOps::save_node(id, &Converter::kv_to_json(&s, "\n"));
}
fn add_rel(&self, s: String, src_id: String, dst_id: String) {
let r = Converter::kv_to_json(&s, "\n");
FileOps::add_rel(r, src_id, dst_id);
}
fn del_rel(&self, id: String) {
FileOps::del_rel(id);
}
fn edit_rel(&self, id: String, s: String) {
FileOps::save_rel(id, Converter::kv_to_json(&s, "\n"));
}
}