Skip to content

Commit 545c700

Browse files
committed
docs(eql): show text encryption in Rustdoc
Make successful encryption discoverable alongside the type contracts. Execute the displayed example in the encryption test crate so its runtime and fake key source stay out of the bindings' default tests. Generate plaintext/context descriptions and EQL reference links with the Rust types so regeneration preserves them. Refs #971
1 parent 3669ca3 commit 545c700

21 files changed

Lines changed: 626 additions & 3 deletions

File tree

‎AGENTS.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ If these variables are missing, tests that require live encryption will fail or
8383
- `packages/utils`: Shared config (`utils/config`) and logger (`utils/logger`)
8484
- `packages/bench`: Performance / index-engagement benchmarks (private, not published)
8585
- `packages/protect-ffi`: Native FFI bindings to the CipherStash Client SDK (`@cipherstash/protect-ffi`) — the Rust core that `packages/stack` encrypts and decrypts through, absorbed from `cipherstash/protectjs-ffi`. Contains a **nested Cargo workspace** (`crates/`) and six per-platform binary packages under `platforms/*`, each published as `@cipherstash/protect-ffi-<platform>` and linked here via `workspace:*`. Also holds the repo's live FFI integration suite at `integration-tests/` — a private workspace member (`@cipherstash/ffi-integration-tests`) enrolled by its own literal entry in `pnpm-workspace.yaml`, needing Docker and credentials, and deliberately carrying **no `test` script** so `pnpm test` cannot reach it. See the "Working on protect-ffi" notes below before touching it — its default `test` and `build` are deliberately Rust-free.
86-
- `packages/eql`: The Encrypt Query Language subtree — the SQL bundle that stores and queries encrypted payloads — absorbed from `cipherstash/encrypt-query-language`. **The directory is the subtree root, not the package.** It was imported at a *verbatim prefix* so its repo-root-relative paths (mise tasks, `Doxyfile`, `sync-generated.mjs`) keep resolving, which puts the npm package `@cipherstash/eql` two levels down at `packages/eql/packages/eql` — the same shape as `packages/protect-ffi/platforms/*`, and enrolled the same way, by an explicit `packages/eql/packages/*` glob in `pnpm-workspace.yaml`. The subtree root deliberately carries no `package.json`. Also contains a **nested Cargo workspace** at `packages/eql/crates/` (`eql-bindings`, published in lockstep with the npm package, plus `eql-domains` / `eql-codegen` / `eql-tests-macros`, which are not), a SQLx test crate at `packages/eql/tests/sqlx`, an unpublished encryption test crate at `packages/eql/tests/encryption` (real encryption with a fake key source, plus optional PostgreSQL coverage), an ~900-line `mise.toml` task surface, its own `AGENTS.md`, and `docs/`. See the "Working on EQL" notes below before touching it.
86+
- `packages/eql`: The Encrypt Query Language subtree — the SQL bundle that stores and queries encrypted payloads — absorbed from `cipherstash/encrypt-query-language`. **The directory is the subtree root, not the package.** It was imported at a *verbatim prefix* so its repo-root-relative paths (mise tasks, `Doxyfile`, `sync-generated.mjs`) keep resolving, which puts the npm package `@cipherstash/eql` two levels down at `packages/eql/packages/eql` — the same shape as `packages/protect-ffi/platforms/*`, and enrolled the same way, by an explicit `packages/eql/packages/*` glob in `pnpm-workspace.yaml`. The subtree root deliberately carries no `package.json`. Also contains a **nested Cargo workspace** at `packages/eql/crates/` (`eql-bindings`, published in lockstep with the npm package, plus `eql-domains` / `eql-codegen` / `eql-tests-macros`, which are not), a SQLx test crate at `packages/eql/tests/sqlx`, an unpublished encryption test crate at `packages/eql/tests/encryption` (real encryption with a fake key source, the executable Rustdoc example at `packages/eql/crates/eql-bindings/src/encryption/example.rs`, plus optional PostgreSQL coverage), an ~900-line `mise.toml` task surface, its own `AGENTS.md`, and `docs/`. See the "Working on EQL" notes below before touching it.
8787
**Repository ownership:** EQL now lives in `cipherstash/stack`. File and update
8888
EQL issues in this repository, never in the historical
8989
`cipherstash/encrypt-query-language` repository. Old upstream issue and PR

‎SECURITY.md‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,9 @@ same terms as the npm packages above.
2828

2929
The `eql-encryption-tests` Rust crate (`packages/eql/tests/encryption`) is
3030
an unpublished test harness for these bindings. It uses real encryption with
31-
a fake key source and an optional disposable PostgreSQL database; it adds no
32-
published package or production service.
31+
a fake key source, executes the Rustdoc text encryption example, and provides
32+
optional disposable PostgreSQL coverage. It adds no published package or
33+
production service.
3334

3435
> **Note on publishing.** `@cipherstash/eql` and the `eql-bindings` crate are
3536
> developed here but are *published* from `cipherstash/encrypt-query-language`

‎packages/eql/crates/eql-bindings/Cargo.toml‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,9 @@ hex = { version = "0.4", optional = true }
4444
default = []
4545
stack-encrypt = ["dep:stack-encrypt", "dep:vitaminc-prf", "dep:base64", "dep:hex"]
4646

47+
[package.metadata.docs.rs]
48+
features = ["stack-encrypt"]
49+
4750
[dev-dependencies]
4851
# Parity oracle: tests/catalog_parity.rs asserts the v3 domain inventory
4952
# exactly covers eql_domains::CATALOG, so the types here cannot drift from

‎packages/eql/crates/eql-bindings/README.md‎

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,18 @@ The optional `stack-encrypt` feature enables `EncryptFrom<String>` for `TextEq`
105105
and `TextEqQuery`, and `DecryptInto<String>` for `TextEq`. Other domains do not
106106
yet expose these conversions. The derives are emitted by `eql-codegen`.
107107

108+
The generated API docs include a complete, executable example in the
109+
`eql_bindings::encryption` module, from cipher setup through decryption. Its
110+
[source](src/encryption/example.rs) is also run by the encryption test crate:
111+
112+
```bash
113+
# From packages/eql, using the unpublished suite checkout:
114+
bash tasks/dev/with-stack-encrypt.sh /path/to/cipherstash-suite \
115+
test -p eql-encryption-tests --test text_eq_example
116+
```
117+
118+
With an initialized cipher, the essential calls are:
119+
108120
```rust,ignore
109121
use eql_bindings::{Identifier, v3::text::{TextEq, TextEqQuery}};
110122

‎packages/eql/crates/eql-bindings/src/encryption.rs‎

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,38 @@
1111
//! [`TextEq`]: crate::v3::text::TextEq
1212
//! [`TextEqQuery`]: crate::v3::text::TextEqQuery
1313
//!
14+
//! # Example
15+
//!
16+
//! Enable the `stack-encrypt` feature on `eql-bindings`. Both targets accept
17+
//! a [`String`] as plaintext and a [`NonEmpty<Identifier>`] as context.
18+
//! [`Identifier::for_column`] validates the table and column; the returned
19+
//! identifier is passed directly to `encrypt_as` and stored in the output's `i`.
20+
//! The output type selects the encryption operations: [`TextEq`] includes
21+
//! ciphertext and an equality term, while [`TextEqQuery`] contains only the term.
22+
//!
23+
//! This complete example runs locally without credentials. It uses real
24+
//! encryption with `stack_kms::FakeDataKeySource`, whose keys exist only for
25+
//! this process. Add `stack-encrypt`, `stack-kms` (with `default-features = false`
26+
//! and `features = ["test-support"]`), and `tokio` (with `features = ["rt", "macros"]`)
27+
//! to your example's dependencies. Stack Encrypt is currently unpublished;
28+
//! use the local development helper described in the crate README.
29+
//!
30+
//! The code below is executed by `cargo test -p eql-encryption-tests --test
31+
//! text_eq_example`. It is excluded from this crate's doctests so its optional
32+
//! test key source and runtime remain in the separate encryption test crate.
33+
#![doc = concat!("```rust,ignore\n", include_str!("encryption/example.rs"), "\n```")]
34+
//!
35+
//! For ZeroKMS, enable Stack Encrypt's `http` feature and replace the fake-key
36+
//! builder with `StackCipher::new().await?`, using your configured CipherStash
37+
//! credentials. The encryption and decryption calls are identical.
38+
//!
39+
//! Use the same table and column identifier for writes and queries. Passing
40+
//! `column.into()` on decryption also checks that the stored identifier matches
41+
//! the expected destination before retrieving keys. `Default::default()` instead
42+
//! uses the stored identifier alone.
43+
//!
44+
//! # Unsupported conversions
45+
//!
1446
//! Query terms cannot recover plaintext:
1547
//! ```compile_fail
1648
//! use eql_bindings::v3::text::TextEqQuery;
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
use eql_bindings::{
2+
v3::text::{TextEq, TextEqQuery},
3+
Identifier,
4+
};
5+
use stack_encrypt::StackCipher;
6+
use stack_kms::FakeDataKeySource;
7+
8+
#[tokio::main(flavor = "current_thread")]
9+
async fn main() -> Result<(), Box<dyn std::error::Error>> {
10+
// Local example only: these keys are held in memory, not in ZeroKMS.
11+
let cipher = StackCipher::builder()
12+
.kms(FakeDataKeySource::new())
13+
.init()
14+
.await?;
15+
let keyset = cipher.default_keyset();
16+
let column = Identifier::for_column("users", "email")?;
17+
let email = String::from("alice@example.com");
18+
19+
// The output type selects ciphertext plus the equality term.
20+
let stored: TextEq = keyset.encrypt_as(&email, column.clone()).await?;
21+
assert_eq!(stored.i.t, "users");
22+
assert_eq!(stored.i.c, "email");
23+
24+
// Use the same identifier to produce an equality query for this column.
25+
let query: TextEqQuery = keyset.encrypt_as(&email, column.clone()).await?;
26+
assert_eq!(stored.hm, query.hm);
27+
28+
// Decrypt to String, also checking the expected table and column.
29+
let opened: String = cipher.decrypt_as(stored, column.into()).await?;
30+
assert_eq!(opened, email);
31+
Ok(())
32+
}

‎packages/eql/crates/eql-bindings/src/lib.rs‎

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,13 @@
2525
//!
2626
//! Wire rule: **field names ARE wire names** — no `#[serde(rename)]`
2727
//! anywhere. The struct definition reads exactly like the JSON payload.
28+
//!
29+
//! Enable the `stack-encrypt` feature to encrypt Rust strings into `TextEq`
30+
//! storage values and `TextEqQuery` search values.
31+
#![cfg_attr(
32+
feature = "stack-encrypt",
33+
doc = "See the [complete encryption example](encryption#example), including cipher setup, table/column identifiers, and decryption."
34+
)]
2835

2936
use schemars::JsonSchema;
3037
use serde::{Deserialize, Serialize};

‎packages/eql/crates/eql-bindings/src/v3/bigint.rs‎

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,11 @@ use ts_rs::TS;
99
/// `public.eql_v3_bigint` — storage-only domain.
1010
///
1111
/// Operators: none. Required keys: `v` `i` `c`.
12+
#[cfg_attr(doc, doc = "")]
13+
#[cfg_attr(
14+
doc,
15+
doc = " See the [EQL bigint reference](https://cipherstash.com/docs/reference/eql/numbers) for SQL domain variants, operators, and query examples."
16+
)]
1217
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
1318
#[ts(export, export_to = "v3/")]
1419
#[serde(deny_unknown_fields)]
@@ -40,6 +45,11 @@ impl DomainType for Bigint {
4045
/// `public.eql_v3_bigint_eq` — equality domain.
4146
///
4247
/// Operators: `=` `<>`. Required keys: `v` `i` `c` `hm`.
48+
#[cfg_attr(doc, doc = "")]
49+
#[cfg_attr(
50+
doc,
51+
doc = " See the [EQL bigint reference](https://cipherstash.com/docs/reference/eql/numbers) for SQL domain variants, operators, and query examples."
52+
)]
4353
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
4454
#[ts(export, export_to = "v3/")]
4555
#[serde(deny_unknown_fields)]
@@ -72,6 +82,11 @@ impl DomainType for BigintEq {
7282
/// `public.eql_v3_bigint_ord_ore` — ordering domain.
7383
///
7484
/// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.
85+
#[cfg_attr(doc, doc = "")]
86+
#[cfg_attr(
87+
doc,
88+
doc = " See the [EQL bigint reference](https://cipherstash.com/docs/reference/eql/numbers) for SQL domain variants, operators, and query examples."
89+
)]
7590
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
7691
#[ts(export, export_to = "v3/")]
7792
#[serde(deny_unknown_fields)]
@@ -104,6 +119,11 @@ impl DomainType for BigintOrdOre {
104119
/// `public.eql_v3_bigint_ord` — ordering domain.
105120
///
106121
/// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `op`.
122+
#[cfg_attr(doc, doc = "")]
123+
#[cfg_attr(
124+
doc,
125+
doc = " See the [EQL bigint reference](https://cipherstash.com/docs/reference/eql/numbers) for SQL domain variants, operators, and query examples."
126+
)]
107127
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
108128
#[ts(export, export_to = "v3/")]
109129
#[serde(deny_unknown_fields)]
@@ -136,6 +156,11 @@ impl DomainType for BigintOrd {
136156
/// `public.eql_v3_bigint_ord_ope` — ordering domain.
137157
///
138158
/// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `op`.
159+
#[cfg_attr(doc, doc = "")]
160+
#[cfg_attr(
161+
doc,
162+
doc = " See the [EQL bigint reference](https://cipherstash.com/docs/reference/eql/numbers) for SQL domain variants, operators, and query examples."
163+
)]
139164
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
140165
#[ts(export, export_to = "v3/")]
141166
#[serde(deny_unknown_fields)]
@@ -168,6 +193,11 @@ impl DomainType for BigintOrdOpe {
168193
/// `eql_v3.query_bigint_eq` — equality domain query operand.
169194
///
170195
/// Operators: `=` `<>`. Required keys: `v` `i` `hm`.
196+
#[cfg_attr(doc, doc = "")]
197+
#[cfg_attr(
198+
doc,
199+
doc = " See the [EQL bigint reference](https://cipherstash.com/docs/reference/eql/numbers) for SQL domain variants, operators, and query examples."
200+
)]
171201
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
172202
#[ts(export, export_to = "v3/")]
173203
#[serde(deny_unknown_fields)]
@@ -199,6 +229,11 @@ impl DomainType for BigintEqQuery {
199229
/// `eql_v3.query_bigint_ord_ore` — ordering domain query operand.
200230
///
201231
/// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.
232+
#[cfg_attr(doc, doc = "")]
233+
#[cfg_attr(
234+
doc,
235+
doc = " See the [EQL bigint reference](https://cipherstash.com/docs/reference/eql/numbers) for SQL domain variants, operators, and query examples."
236+
)]
202237
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
203238
#[ts(export, export_to = "v3/")]
204239
#[serde(deny_unknown_fields)]
@@ -230,6 +265,11 @@ impl DomainType for BigintOrdOreQuery {
230265
/// `eql_v3.query_bigint_ord` — ordering domain query operand.
231266
///
232267
/// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`.
268+
#[cfg_attr(doc, doc = "")]
269+
#[cfg_attr(
270+
doc,
271+
doc = " See the [EQL bigint reference](https://cipherstash.com/docs/reference/eql/numbers) for SQL domain variants, operators, and query examples."
272+
)]
233273
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
234274
#[ts(export, export_to = "v3/")]
235275
#[serde(deny_unknown_fields)]
@@ -261,6 +301,11 @@ impl DomainType for BigintOrdQuery {
261301
/// `eql_v3.query_bigint_ord_ope` — ordering domain query operand.
262302
///
263303
/// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`.
304+
#[cfg_attr(doc, doc = "")]
305+
#[cfg_attr(
306+
doc,
307+
doc = " See the [EQL bigint reference](https://cipherstash.com/docs/reference/eql/numbers) for SQL domain variants, operators, and query examples."
308+
)]
264309
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
265310
#[ts(export, export_to = "v3/")]
266311
#[serde(deny_unknown_fields)]

‎packages/eql/crates/eql-bindings/src/v3/boolean.rs‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,11 @@ use ts_rs::TS;
99
/// `public.eql_v3_boolean` — storage-only domain.
1010
///
1111
/// Operators: none. Required keys: `v` `i` `c`.
12+
#[cfg_attr(doc, doc = "")]
13+
#[cfg_attr(
14+
doc,
15+
doc = " See the [EQL boolean reference](https://cipherstash.com/docs/reference/eql/booleans) for SQL domain variants, operators, and query examples."
16+
)]
1217
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
1318
#[ts(export, export_to = "v3/")]
1419
#[serde(deny_unknown_fields)]

‎packages/eql/crates/eql-bindings/src/v3/date.rs‎

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,11 @@ use ts_rs::TS;
99
/// `public.eql_v3_date` — storage-only domain.
1010
///
1111
/// Operators: none. Required keys: `v` `i` `c`.
12+
#[cfg_attr(doc, doc = "")]
13+
#[cfg_attr(
14+
doc,
15+
doc = " See the [EQL date reference](https://cipherstash.com/docs/reference/eql/dates-and-times) for SQL domain variants, operators, and query examples."
16+
)]
1217
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
1318
#[ts(export, export_to = "v3/")]
1419
#[serde(deny_unknown_fields)]
@@ -40,6 +45,11 @@ impl DomainType for Date {
4045
/// `public.eql_v3_date_eq` — equality domain.
4146
///
4247
/// Operators: `=` `<>`. Required keys: `v` `i` `c` `hm`.
48+
#[cfg_attr(doc, doc = "")]
49+
#[cfg_attr(
50+
doc,
51+
doc = " See the [EQL date reference](https://cipherstash.com/docs/reference/eql/dates-and-times) for SQL domain variants, operators, and query examples."
52+
)]
4353
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
4454
#[ts(export, export_to = "v3/")]
4555
#[serde(deny_unknown_fields)]
@@ -72,6 +82,11 @@ impl DomainType for DateEq {
7282
/// `public.eql_v3_date_ord_ore` — ordering domain.
7383
///
7484
/// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.
85+
#[cfg_attr(doc, doc = "")]
86+
#[cfg_attr(
87+
doc,
88+
doc = " See the [EQL date reference](https://cipherstash.com/docs/reference/eql/dates-and-times) for SQL domain variants, operators, and query examples."
89+
)]
7590
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
7691
#[ts(export, export_to = "v3/")]
7792
#[serde(deny_unknown_fields)]
@@ -104,6 +119,11 @@ impl DomainType for DateOrdOre {
104119
/// `public.eql_v3_date_ord` — ordering domain.
105120
///
106121
/// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `op`.
122+
#[cfg_attr(doc, doc = "")]
123+
#[cfg_attr(
124+
doc,
125+
doc = " See the [EQL date reference](https://cipherstash.com/docs/reference/eql/dates-and-times) for SQL domain variants, operators, and query examples."
126+
)]
107127
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
108128
#[ts(export, export_to = "v3/")]
109129
#[serde(deny_unknown_fields)]
@@ -136,6 +156,11 @@ impl DomainType for DateOrd {
136156
/// `public.eql_v3_date_ord_ope` — ordering domain.
137157
///
138158
/// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `op`.
159+
#[cfg_attr(doc, doc = "")]
160+
#[cfg_attr(
161+
doc,
162+
doc = " See the [EQL date reference](https://cipherstash.com/docs/reference/eql/dates-and-times) for SQL domain variants, operators, and query examples."
163+
)]
139164
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
140165
#[ts(export, export_to = "v3/")]
141166
#[serde(deny_unknown_fields)]
@@ -168,6 +193,11 @@ impl DomainType for DateOrdOpe {
168193
/// `eql_v3.query_date_eq` — equality domain query operand.
169194
///
170195
/// Operators: `=` `<>`. Required keys: `v` `i` `hm`.
196+
#[cfg_attr(doc, doc = "")]
197+
#[cfg_attr(
198+
doc,
199+
doc = " See the [EQL date reference](https://cipherstash.com/docs/reference/eql/dates-and-times) for SQL domain variants, operators, and query examples."
200+
)]
171201
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
172202
#[ts(export, export_to = "v3/")]
173203
#[serde(deny_unknown_fields)]
@@ -199,6 +229,11 @@ impl DomainType for DateEqQuery {
199229
/// `eql_v3.query_date_ord_ore` — ordering domain query operand.
200230
///
201231
/// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.
232+
#[cfg_attr(doc, doc = "")]
233+
#[cfg_attr(
234+
doc,
235+
doc = " See the [EQL date reference](https://cipherstash.com/docs/reference/eql/dates-and-times) for SQL domain variants, operators, and query examples."
236+
)]
202237
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
203238
#[ts(export, export_to = "v3/")]
204239
#[serde(deny_unknown_fields)]
@@ -230,6 +265,11 @@ impl DomainType for DateOrdOreQuery {
230265
/// `eql_v3.query_date_ord` — ordering domain query operand.
231266
///
232267
/// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`.
268+
#[cfg_attr(doc, doc = "")]
269+
#[cfg_attr(
270+
doc,
271+
doc = " See the [EQL date reference](https://cipherstash.com/docs/reference/eql/dates-and-times) for SQL domain variants, operators, and query examples."
272+
)]
233273
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
234274
#[ts(export, export_to = "v3/")]
235275
#[serde(deny_unknown_fields)]
@@ -261,6 +301,11 @@ impl DomainType for DateOrdQuery {
261301
/// `eql_v3.query_date_ord_ope` — ordering domain query operand.
262302
///
263303
/// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`.
304+
#[cfg_attr(doc, doc = "")]
305+
#[cfg_attr(
306+
doc,
307+
doc = " See the [EQL date reference](https://cipherstash.com/docs/reference/eql/dates-and-times) for SQL domain variants, operators, and query examples."
308+
)]
264309
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
265310
#[ts(export, export_to = "v3/")]
266311
#[serde(deny_unknown_fields)]

0 commit comments

Comments
 (0)