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 qailRust Library
[dependencies]
qail-core = "0.5.0"JavaScript/TypeScript (WASM)
npm install qail-wasmUsage
// 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 = trueAll Columns (Wildcard)
get::users:'_SELECT * FROM usersPagination with Range
get::users:'_ [ 20..30 ]SELECT * FROM users LIMIT 10 OFFSET 20Sorting
get::users:'_ [ -created_at ]SELECT * FROM users ORDER BY created_at DESCget::users:'_ [ +name ]SELECT * FROM users ORDER BY name ASCOR Conditions
get::users:'_ [ 'role == "admin" | 'role == "mod" ]SELECT * FROM users WHERE role = 'admin' OR role = 'mod'
DISTINCT
get!::users:'roleSELECT DISTINCT role FROM usersUPDATE
set::users:[ verified = true ][ 'id == $1 ]UPDATE users SET verified = true WHERE id = $1DELETE
del::users:[ 'id == $1 ]DELETE FROM users WHERE id = $1JOINs
get::users<-profiles:'name'avatarSELECT 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 ]