use async_graphql::*;
use chrono::{DateTime, Utc};
#[derive(Debug, Clone, SimpleObject)]
pub struct Triple {
pub id: ID,
pub subject: String,
pub predicate: String,
pub object: TripleValue,
pub created_at: DateTime<Utc>,
}
#[derive(Debug, Clone, Union)]
pub enum TripleValue {
String(StringValue),
Integer(IntegerValue),
Float(FloatValue),
Boolean(BooleanValue),
Node(NodeValue),
}
#[derive(Debug, Clone, SimpleObject)]
pub struct StringValue {
pub value: String,
}
#[derive(Debug, Clone, SimpleObject)]
pub struct IntegerValue {
pub value: i64,
}
#[derive(Debug, Clone, SimpleObject)]
pub struct FloatValue {
pub value: f64,
}
#[derive(Debug, Clone, SimpleObject)]
pub struct BooleanValue {
pub value: bool,
}
#[derive(Debug, Clone, SimpleObject)]
pub struct NodeValue {
pub iri: String,
}
impl From<aingle_graph::Value> for TripleValue {
fn from(v: aingle_graph::Value) -> Self {
match v {
aingle_graph::Value::String(s) => TripleValue::String(StringValue { value: s }),
aingle_graph::Value::Integer(i) => TripleValue::Integer(IntegerValue { value: i }),
aingle_graph::Value::Float(f) => TripleValue::Float(FloatValue { value: f }),
aingle_graph::Value::Boolean(b) => TripleValue::Boolean(BooleanValue { value: b }),
aingle_graph::Value::Node(n) => TripleValue::Node(NodeValue { iri: n.to_string() }),
aingle_graph::Value::DateTime(dt) => TripleValue::String(StringValue { value: dt }),
aingle_graph::Value::Typed { value, .. } => TripleValue::String(StringValue { value }),
aingle_graph::Value::LangString { value, .. } => {
TripleValue::String(StringValue { value })
}
aingle_graph::Value::Bytes(_) => TripleValue::String(StringValue {
value: "[binary]".to_string(),
}),
aingle_graph::Value::Json(v) => TripleValue::String(StringValue {
value: v.to_string(),
}),
aingle_graph::Value::Null => TripleValue::String(StringValue {
value: "null".to_string(),
}),
}
}
}
impl From<aingle_graph::Triple> for Triple {
fn from(t: aingle_graph::Triple) -> Self {
Self {
id: ID(t.id().to_hex()),
subject: t.subject.to_string(),
predicate: t.predicate.to_string(),
object: t.object.into(),
created_at: t.meta.created_at,
}
}
}
#[derive(Debug, Clone, InputObject)]
pub struct TripleFilter {
pub subject: Option<String>,
pub predicate: Option<String>,
pub subject_prefix: Option<String>,
pub predicate_prefix: Option<String>,
}
#[derive(Debug, Clone, InputObject)]
pub struct TripleInput {
pub subject: String,
pub predicate: String,
pub object: ValueInput,
}
#[derive(Debug, Clone, InputObject)]
pub struct ValueInput {
pub string: Option<String>,
pub integer: Option<i64>,
pub float: Option<f64>,
pub boolean: Option<bool>,
pub node: Option<String>,
}
impl From<ValueInput> for aingle_graph::Value {
fn from(v: ValueInput) -> Self {
if let Some(s) = v.string {
aingle_graph::Value::String(s)
} else if let Some(i) = v.integer {
aingle_graph::Value::Integer(i)
} else if let Some(f) = v.float {
aingle_graph::Value::Float(f)
} else if let Some(b) = v.boolean {
aingle_graph::Value::Boolean(b)
} else if let Some(n) = v.node {
aingle_graph::Value::Node(aingle_graph::NodeId::named(&n))
} else {
aingle_graph::Value::Null
}
}
}
#[derive(Debug, Clone, InputObject)]
pub struct PatternInput {
pub subject: Option<String>,
pub predicate: Option<String>,
pub object: Option<ValueInput>,
}
#[derive(Debug, Clone, SimpleObject)]
pub struct QueryResult {
pub matches: Vec<Triple>,
pub total: i32,
}
#[derive(Debug, Clone, SimpleObject)]
pub struct GraphStats {
pub triple_count: i32,
pub subject_count: i32,
pub predicate_count: i32,
pub object_count: i32,
}
#[derive(Debug, Clone, SimpleObject)]
pub struct LogicProof {
pub hash: ID,
pub steps: Vec<ProofStep>,
pub valid: bool,
pub verified_at: DateTime<Utc>,
}
#[derive(Debug, Clone, SimpleObject)]
pub struct ProofStep {
pub index: i32,
pub rule: String,
pub premises: Vec<String>,
pub conclusion: String,
}
#[derive(Debug, Clone, SimpleObject)]
pub struct TripleValidationResult {
pub valid: bool,
pub messages: Vec<ValidationMessage>,
pub proof_hash: Option<String>,
}
#[derive(Debug, Clone, SimpleObject)]
pub struct ValidationMessage {
pub level: String,
pub message: String,
pub rule: Option<String>,
}
#[derive(Debug, Clone, SimpleObject)]
pub struct ValidationEvent {
pub hash: String,
pub valid: bool,
pub proof_hash: Option<String>,
pub timestamp: DateTime<Utc>,
}
#[derive(Debug, Clone, SimpleObject)]
pub struct SparqlResult {
pub variables: Vec<String>,
pub bindings: Vec<SparqlBinding>,
pub execution_time_ms: i32,
}
#[derive(Debug, Clone, SimpleObject)]
pub struct SparqlBinding {
pub values: String,
}