restqs/lib.rs
1//! REST Query Syntax parser for REST API filtering plans.
2//!
3//! RestQS parses RQS query strings into typed plans. The core parser does not
4//! emit SQL. Database and ORM translation lives in adapters, so application
5//! code can keep parsing, authorization, and persistence concerns separate.
6//!
7//! A service starts with a [`FieldCatalog`]. The catalog maps public query
8//! fields to trusted database columns and value kinds. The parser checks every
9//! requested field against that catalog and returns [`RqsQuery`].
10//!
11//! # Basic Parsing
12//!
13//! ```
14//! use restqs::{FieldCatalog, parse};
15//!
16//! let catalog = FieldCatalog::new()
17//! .allow_integer("age", "users.age")?
18//! .allow_text("status", "users.status")?;
19//!
20//! let query = parse("age>=18&status=in(active,pending)", &catalog)?;
21//!
22//! assert_eq!(query.filters().len(), 2);
23//! # Ok::<(), restqs::RqsError>(())
24//! ```
25//!
26//! # Safe Defaults
27//!
28//! RestQS treats query strings as untrusted input. User field names never
29//! become database identifiers. Adapters receive trusted catalog columns and
30//! typed [`RqsValue`] values.
31//!
32//! The default [`ParserLimits`] cap raw query length at 8 KiB, parameter count
33//! at 128, single value length at 2 KiB, list item count at 100, and `limit=`
34//! at 100.
35//!
36//! # Adapter Boundary
37//!
38//! The `sqlx` feature exposes SQLx-oriented fragment generation through
39//! [`adapters::sqlx`]. The adapter returns SQL fragments and bind values. The
40//! host repository still owns the final SQL statement, connection, transaction,
41//! and result mapping.
42
43#![forbid(unsafe_code)]
44#![deny(missing_docs)]
45#![deny(clippy::expect_used)]
46#![deny(clippy::panic)]
47#![deny(clippy::todo)]
48#![deny(clippy::unwrap_used)]
49#![deny(rustdoc::bare_urls)]
50#![deny(rustdoc::broken_intra_doc_links)]
51
52pub mod adapters;
53mod catalog;
54mod error;
55mod filter;
56mod limits;
57mod pagination;
58mod parameter;
59mod parser;
60mod projection;
61mod query;
62mod sort;
63mod value;
64
65pub use catalog::{Field, FieldCatalog, FieldRef, ValueKind};
66pub use error::{RqsError, RqsResult};
67pub use filter::{Filter, FilterOp, RegexLiteral};
68pub use limits::ParserLimits;
69pub use pagination::Pagination;
70pub use parser::{Parser, ParserConfig, parse};
71pub use projection::Projection;
72pub use query::RqsQuery;
73pub use sort::{SortDirection, SortTerm};
74pub use value::RqsValue;