sql_composer/lib.rs
1//! sql-composer: A SQL template engine that composes reusable SQL fragments
2//! with parameterized bindings.
3//!
4//! Templates use a simple macro syntax embedded in SQL:
5//! - `:bind(name)` — parameter placeholder
6//! - `:compose(path)` — include another template
7//! - `:count(sources...)` — count aggregate
8//! - `:union(sources...)` — union combinator
9//!
10//! SQL text is treated as opaque literals and passed through unchanged.
11//! Only the macro syntax is parsed.
12//!
13//! # Example
14//!
15//! ```
16//! use sql_composer::parser::parse_template;
17//! use sql_composer::composer::Composer;
18//! use sql_composer::types::{Dialect, TemplateSource};
19//!
20//! let input = "SELECT * FROM users WHERE id = :bind(user_id) AND active = :bind(active);";
21//! let template = parse_template(input, TemplateSource::Literal("example".into())).unwrap();
22//!
23//! let composer = Composer::new(Dialect::Postgres);
24//! let result = composer.compose(&template).unwrap();
25//!
26//! // Alphabetical ordering: active=$1, user_id=$2
27//! assert_eq!(result.sql, "SELECT * FROM users WHERE id = $2 AND active = $1;");
28//! assert_eq!(result.bind_params, vec!["active", "user_id"]);
29//! ```
30
31mod clippy;
32pub mod composer;
33pub mod driver;
34pub mod error;
35pub mod mock;
36pub mod parser;
37pub mod types;
38
39pub use composer::{ComposedSql, Composer};
40pub use error::Error;
41pub use mock::MockTable;
42pub use types::{
43 Binding, Command, CommandKind, ComposeRef, ComposeTarget, Dialect, Element, SlotAssignment,
44 Template, TemplateSource,
45};