Skip to main content

sqlitegraph/graph/
types.rs

1use serde::{Deserialize, Serialize};
2
3use crate::errors::SqliteGraphError;
4
5#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
6pub struct GraphEntity {
7    pub id: i64,
8    pub kind: String,
9    pub name: String,
10    pub file_path: Option<String>,
11    pub data: serde_json::Value,
12}
13
14#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
15pub struct GraphEdge {
16    pub id: i64,
17    pub from_id: i64,
18    pub to_id: i64,
19    pub edge_type: String,
20    pub data: serde_json::Value,
21}
22
23pub fn validate_entity(entity: &GraphEntity) -> Result<(), SqliteGraphError> {
24    if entity.kind.trim().is_empty() {
25        return Err(SqliteGraphError::invalid_input("entity kind must be set"));
26    }
27    if entity.name.trim().is_empty() {
28        return Err(SqliteGraphError::invalid_input("entity name must be set"));
29    }
30    Ok(())
31}
32
33pub fn validate_edge(edge: &GraphEdge) -> Result<(), SqliteGraphError> {
34    if edge.edge_type.trim().is_empty() {
35        return Err(SqliteGraphError::invalid_input("edge type must be set"));
36    }
37    if edge.from_id <= 0 || edge.to_id <= 0 {
38        return Err(SqliteGraphError::invalid_input(
39            "edge endpoints must be positive ids",
40        ));
41    }
42    Ok(())
43}
44
45pub fn row_to_entity(row: &rusqlite::Row<'_>) -> Result<GraphEntity, rusqlite::Error> {
46    let data: String = row.get(4)?;
47    let value: serde_json::Value = serde_json::from_str(&data).map_err(|e| {
48        rusqlite::Error::FromSqlConversionFailure(
49            data.len(),
50            rusqlite::types::Type::Text,
51            Box::new(e),
52        )
53    })?;
54    Ok(GraphEntity {
55        id: row.get(0)?,
56        kind: row.get(1)?,
57        name: row.get(2)?,
58        file_path: row.get(3)?,
59        data: value,
60    })
61}
62
63pub fn row_to_edge(row: &rusqlite::Row<'_>) -> Result<GraphEdge, rusqlite::Error> {
64    let data: String = row.get(4)?;
65    let value: serde_json::Value = serde_json::from_str(&data).map_err(|e| {
66        rusqlite::Error::FromSqlConversionFailure(
67            data.len(),
68            rusqlite::types::Type::Text,
69            Box::new(e),
70        )
71    })?;
72    Ok(GraphEdge {
73        id: row.get(0)?,
74        from_id: row.get(1)?,
75        to_id: row.get(2)?,
76        edge_type: row.get(3)?,
77        data: value,
78    })
79}