Quick Reference

Symbol Name Function SQL Equivalent
:: The Gate Action (get/set/del/add) SELECT/UPDATE...
: The Link Connect table to columns FROM table
' The Label Mark a column col1, col2
'_ The Wildcard All columns *
[ ] The Cage Constraints block WHERE/LIMIT...
== The Equal Equality check = value
~ The Fuse Fuzzy Match ILIKE
| The Split Logical OR OR
& The Bind Logical AND AND
+col Sort Asc Ascending sort ORDER BY col ASC
-col Sort Desc Descending sort ORDER BY col DESC
N..M The Range Pagination LIMIT M-N OFFSET N
$ The Var Parameter $1
! The Unique Distinct DISTINCT
<- The Left Left Join LEFT JOIN
->> The Right Inner Join INNER JOIN

Installation

CLI

cargo install qail

Rust Library

[dependencies] qail-core = "0.5.0"

JavaScript/TypeScript (WASM)

npm install qail-wasm

Usage

// Rust - compile-time validation let sql = qail!("get::users:'_[active=true]"); // JavaScript - runtime validation import { parseAndTranspile } from 'qail-wasm'; const sql = parseAndTranspile("get::users:'_[active=true]");

Syntax Deep Dive

Simple SELECT

get::users:'id'email [ 'active == true ]
SELECT id, email FROM users WHERE active = true

All Columns (Wildcard)

get::users:'_
SELECT * FROM users

Pagination with Range

get::users:'_ [ 20..30 ]
SELECT * FROM users LIMIT 10 OFFSET 20

Sorting

get::users:'_ [ -created_at ]
SELECT * FROM users ORDER BY created_at DESC
get::users:'_ [ +name ]
SELECT * FROM users ORDER BY name ASC

OR Conditions

get::users:'_ [ 'role == "admin" | 'role == "mod" ]
SELECT * FROM users WHERE role = 'admin' OR role = 'mod'

DISTINCT

get!::users:'role
SELECT DISTINCT role FROM users

UPDATE

set::users:[ verified = true ][ 'id == $1 ]
UPDATE users SET verified = true WHERE id = $1

DELETE

del::users:[ 'id == $1 ]
DELETE FROM users WHERE id = $1

JOINs

get::users<-profiles:'name'avatar
SELECT name, avatar FROM users LEFT JOIN profiles ON ...

Real-World Examples

Search with Fuzzy Match

get::users:'id'name [ 'name ~ "john" ]
SELECT id, name FROM users WHERE name ILIKE '%john%'

Complex Filter

get::bookings:'_ [ 'status == "confirmed" & 'created_at >= "2024-01-01", -created_at, 0..50 ]
SELECT * FROM bookings WHERE status = 'confirmed' AND created_at >= '2024-01-01' ORDER BY created_at DESC LIMIT 50

Multi-Line (Vertical Escape Hatch)

get::users->bookings:'_
    [ 'created_at >= "2024-01-01" ]
    [ 'email_verified == true ]
    [ 'bookings.campaign_code ~ $1 ]
    [ -created_at ]
    [ 0..50 ]