sqlitegraph/graph/
types.rs1use 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}