sqlitegraph 2.2.2

Embedded graph database with full ACID transactions, HNSW vector search, dual backend support, and comprehensive graph algorithms library
Documentation
use crate::{
    backend::BackendDirection,
    pattern::{PatternLeg, PatternQuery},
};

#[derive(Debug, Clone)]
pub enum DslResult {
    Pattern(PatternQuery),
    Error(String),
}

pub fn parse_dsl(input: &str) -> DslResult {
    let trimmed = input.trim();
    if trimmed.is_empty() {
        return DslResult::Error("empty DSL string".into());
    }
    if trimmed.contains("->") || trimmed.contains('*') {
        return DslResult::Pattern(parse_repetitive_pattern(trimmed));
    }
    DslResult::Error(format!("unsupported DSL form: {trimmed}"))
}

fn parse_repetitive_pattern(segment: &str) -> PatternQuery {
    let mut legs = Vec::new();
    for token in segment.split("->") {
        let trimmed = token.trim();
        if trimmed.is_empty() {
            continue;
        }
        let (ty, count) = if let Some((name, times)) = trimmed.split_once('*') {
            let repeats = times.trim().parse::<usize>().unwrap_or(1);
            (name.trim(), repeats)
        } else {
            (trimmed, 1)
        };
        for _ in 0..count {
            legs.push(PatternLeg {
                direction: BackendDirection::Outgoing,
                edge_type: Some(ty.to_string()),
                constraint: None,
            });
        }
    }
    PatternQuery { root: None, legs }
}