surrealex

Crates.iosurrealex
lib.rssurrealex
version1.0.3
created_at2025-07-06 08:50:11.722346+00
updated_at2026-01-04 15:16:26.143494+00
descriptionDead simple SurrealDB query generator
homepage
repositoryhttps://github.com/MordechaiHadad/surrealex
max_upload_size
id1740003
size51,934
core (github:atopio:core)

documentation

README

Surrealex

Dead simple SurrealDB query generator.

A Rust library for building SurrealQL queries with a fluent, type-safe API.

🌟 Features

  • Fluent builder API with compile-time state checking
  • Type-safe field selection using the fields! macro
  • Complex WHERE conditions and graph traversal support
  • Support for SELECT, FROM, WHERE, FETCH, ORDER BY, LIMIT, and START AT

📦 Installation

Add to your Cargo.toml:

[dependencies]
surrealex = { version = "0.1.0", features = ["macros"] }

Or from Git:

[dependencies]
surrealex = { git = "https://github.com/MordechaiHadad/surrealex", features = ["macros"] }

🔧 Usage

Basic Query

use surrealex::QueryBuilder;

let query = QueryBuilder::select(surrealex::fields!("id", "name"))
    .from("users")
    .r#where("age > 18")
    .order_by("created_at", Sort::Desc, false, false)
    .limit(10)
    .build();

assert_eq!(query, "SELECT id, name FROM users WHERE age > 18 ORDER BY created_at DESC LIMIT 10");

Complex WHERE Conditions

use surrealex::enums::Condition;

let query = QueryBuilder::select(surrealex::fields!("id"))
    .from("users")
    .r#where(Condition::And(vec![
        Condition::Simple("age > 18".into()),
        Condition::Or(vec![
            Condition::Simple("status = 'active'".into()),
            Condition::Simple("status = 'pending'".into()),
        ]),
    ]))
    .build();

assert_eq!(
    query,
    "SELECT id FROM users WHERE (age > 18 AND (status = 'active' OR status = 'pending'))"
);

Graph Traversal

use surrealex::{enums::Direction, structs::GraphExpandParams};

let query = QueryBuilder::select(surrealex::fields!(*))
    .graph_traverse(GraphExpandParams {
        from: (Direction::Out, "friends".into()),
        to: (Direction::In, "posts".into()),
        alias: Some("friend_posts".into()),
        fields: surrealex::fields!(*),
    })
    .from("user")
    .build();

assert_eq!(
    query,
    "SELECT *, ->friends<-posts.* AS friend_posts FROM user"
);

📝 License

This project is open source. See the repository for license details.

🔗 Links

Commit count: 13

cargo fmt