Skip to main content

faucet_stream/
lib.rs

1#![cfg_attr(docsrs, feature(doc_cfg))]
2
3//! # faucet-stream
4//!
5//! A declarative, config-driven data pipeline with pluggable source and sink
6//! connectors.
7//!
8//! 📖 **Guide, tutorials & cookbook:** <https://pawansikawat.github.io/faucet-stream/>
9//!
10//! ## Feature flags
11//!
12//! | Feature | Description |
13//! |---------|-------------|
14//! | `source-rest` *(default)* | REST API source with pagination, auth, transforms |
15//! | `source-graphql` | GraphQL API source with cursor pagination |
16//! | `source-xml` | XML/SOAP API source with XML-to-JSON conversion |
17//! | `source-grpc` | gRPC source with dynamic protobuf messages |
18//! | `source-postgres` | PostgreSQL query source |
19//! | `source-postgres-cdc` | PostgreSQL CDC source (logical replication) |
20//! | `source-mysql` | MySQL query source |
21//! | `source-mssql` | Microsoft SQL Server query source |
22//! | `source-sqlite` | SQLite query source |
23
24//! | `source-s3` | AWS S3 file source |
25//! | `source-mongodb` | MongoDB query source |
26//! | `source-mongodb-cdc` | MongoDB CDC source (Change Streams) |
27//! | `source-mysql-cdc` | MySQL CDC source (binlog replication) |
28//! | `source-redis` | Redis source (streams, lists, keys) |
29//! | `source-webhook` | Webhook HTTP receiver source |
30//! | `source-websocket` | WebSocket streaming source |
31//! | `source-csv` | CSV file source |
32//! | `source-elasticsearch` | Elasticsearch search/scroll source |
33//! | `source-kafka` | Apache Kafka consumer source |
34//! | `source-parquet` | Apache Parquet file source (local, glob, S3) |
35//! | `sink-bigquery` | Google BigQuery streaming insert sink |
36//! | `sink-iceberg` | Apache Iceberg sink (append-only, REST/Glue/SQL/HMS catalogs) |
37//! | `sink-postgres` | PostgreSQL sink (jsonb or auto-mapped columns) |
38//! | `sink-jsonl` | JSON Lines file sink |
39//! | `sink-snowflake` | Snowflake SQL REST API sink |
40//! | `sink-mysql` | MySQL sink |
41//! | `sink-mssql` | Microsoft SQL Server sink |
42//! | `sink-sqlite` | SQLite sink |
43
44//! | `sink-s3` | AWS S3 file sink |
45//! | `sink-mongodb` | MongoDB insert sink |
46//! | `sink-redis` | Redis sink (streams, lists, key-value) |
47//! | `sink-csv` | CSV file sink |
48//! | `sink-elasticsearch` | Elasticsearch bulk index sink |
49//! | `sink-http` | HTTP POST sink |
50//! | `sink-kafka` | Apache Kafka producer sink |
51//! | `sink-parquet` | Apache Parquet file sink (local, S3) |
52//! | `kafka-schema-registry` | Schema Registry support for Kafka connectors |
53//! | `source` | All source connectors |
54//! | `sink` | All sink connectors |
55//! | `full` | Every connector |
56
57// Always re-export core types and traits.
58pub use faucet_core::*;
59
60// Explicit re-exports for the library-side transforms wrapper and observability
61// labels so users can import them via the umbrella path.
62pub use faucet_core::TransformingSource;
63pub use faucet_core::observability::Labels;
64
65// ── Shared auth providers ────────────────────────────────────────────────────
66/// Single-flight OAuth2 / token-endpoint auth providers (enable the `auth`
67/// feature). Share one across connectors via `with_auth_provider` or the CLI
68/// `auth: { ref }` catalog.
69#[cfg(feature = "auth")]
70pub mod auth {
71    pub use faucet_auth::*;
72}
73
74// ── Source connectors ────────────────────────────────────────────────────────
75
76#[cfg(feature = "source-rest")]
77pub mod source {
78    pub mod rest {
79        pub use faucet_source_rest::*;
80    }
81
82    #[cfg(feature = "source-graphql")]
83    pub mod graphql {
84        pub use faucet_source_graphql::*;
85    }
86
87    #[cfg(feature = "source-xml")]
88    pub mod xml {
89        pub use faucet_source_xml::*;
90    }
91
92    #[cfg(feature = "source-grpc")]
93    pub mod grpc {
94        pub use faucet_source_grpc::*;
95    }
96
97    #[cfg(feature = "source-postgres")]
98    pub mod postgres {
99        pub use faucet_source_postgres::*;
100    }
101
102    #[cfg(feature = "source-postgres-cdc")]
103    pub mod postgres_cdc {
104        pub use faucet_source_postgres_cdc::*;
105    }
106
107    #[cfg(feature = "source-mysql")]
108    pub mod mysql {
109        pub use faucet_source_mysql::*;
110    }
111
112    #[cfg(feature = "source-mssql")]
113    pub mod mssql {
114        pub use faucet_source_mssql::*;
115    }
116
117    #[cfg(feature = "source-sqlite")]
118    pub mod sqlite {
119        pub use faucet_source_sqlite::*;
120    }
121
122    #[cfg(feature = "source-s3")]
123    pub mod s3 {
124        pub use faucet_source_s3::*;
125    }
126
127    #[cfg(feature = "source-mongodb")]
128    pub mod mongodb {
129        pub use faucet_source_mongodb::*;
130    }
131
132    #[cfg(feature = "source-mongodb-cdc")]
133    pub mod mongodb_cdc {
134        pub use faucet_source_mongodb_cdc::*;
135    }
136
137    #[cfg(feature = "source-mysql-cdc")]
138    pub mod mysql_cdc {
139        pub use faucet_source_mysql_cdc::*;
140    }
141
142    #[cfg(feature = "source-redis")]
143    pub mod redis {
144        pub use faucet_source_redis::*;
145    }
146
147    #[cfg(feature = "source-webhook")]
148    pub mod webhook {
149        pub use faucet_source_webhook::*;
150    }
151
152    #[cfg(feature = "source-websocket")]
153    pub mod websocket {
154        pub use faucet_source_websocket::*;
155    }
156
157    #[cfg(feature = "source-csv")]
158    pub mod csv {
159        pub use faucet_source_csv::*;
160    }
161
162    #[cfg(feature = "source-elasticsearch")]
163    pub mod elasticsearch {
164        pub use faucet_source_elasticsearch::*;
165    }
166
167    #[cfg(feature = "source-kafka")]
168    pub mod kafka {
169        pub use faucet_source_kafka::*;
170    }
171
172    #[cfg(feature = "source-parquet")]
173    pub mod parquet {
174        pub use faucet_source_parquet::*;
175    }
176
177    #[cfg(feature = "source-gcs")]
178    pub mod gcs {
179        pub use faucet_source_gcs::*;
180    }
181}
182
183// Source modules available without source-rest (when only other sources are enabled).
184#[cfg(not(feature = "source-rest"))]
185pub mod source {
186    #[cfg(feature = "source-graphql")]
187    pub mod graphql {
188        pub use faucet_source_graphql::*;
189    }
190
191    #[cfg(feature = "source-xml")]
192    pub mod xml {
193        pub use faucet_source_xml::*;
194    }
195
196    #[cfg(feature = "source-grpc")]
197    pub mod grpc {
198        pub use faucet_source_grpc::*;
199    }
200
201    #[cfg(feature = "source-postgres")]
202    pub mod postgres {
203        pub use faucet_source_postgres::*;
204    }
205
206    #[cfg(feature = "source-postgres-cdc")]
207    pub mod postgres_cdc {
208        pub use faucet_source_postgres_cdc::*;
209    }
210
211    #[cfg(feature = "source-mysql")]
212    pub mod mysql {
213        pub use faucet_source_mysql::*;
214    }
215
216    #[cfg(feature = "source-mssql")]
217    pub mod mssql {
218        pub use faucet_source_mssql::*;
219    }
220
221    #[cfg(feature = "source-sqlite")]
222    pub mod sqlite {
223        pub use faucet_source_sqlite::*;
224    }
225
226    #[cfg(feature = "source-s3")]
227    pub mod s3 {
228        pub use faucet_source_s3::*;
229    }
230
231    #[cfg(feature = "source-mongodb")]
232    pub mod mongodb {
233        pub use faucet_source_mongodb::*;
234    }
235
236    #[cfg(feature = "source-mongodb-cdc")]
237    pub mod mongodb_cdc {
238        pub use faucet_source_mongodb_cdc::*;
239    }
240
241    #[cfg(feature = "source-mysql-cdc")]
242    pub mod mysql_cdc {
243        pub use faucet_source_mysql_cdc::*;
244    }
245
246    #[cfg(feature = "source-redis")]
247    pub mod redis {
248        pub use faucet_source_redis::*;
249    }
250
251    #[cfg(feature = "source-webhook")]
252    pub mod webhook {
253        pub use faucet_source_webhook::*;
254    }
255
256    #[cfg(feature = "source-websocket")]
257    pub mod websocket {
258        pub use faucet_source_websocket::*;
259    }
260
261    #[cfg(feature = "source-csv")]
262    pub mod csv {
263        pub use faucet_source_csv::*;
264    }
265
266    #[cfg(feature = "source-elasticsearch")]
267    pub mod elasticsearch {
268        pub use faucet_source_elasticsearch::*;
269    }
270
271    #[cfg(feature = "source-kafka")]
272    pub mod kafka {
273        pub use faucet_source_kafka::*;
274    }
275
276    #[cfg(feature = "source-parquet")]
277    pub mod parquet {
278        pub use faucet_source_parquet::*;
279    }
280
281    #[cfg(feature = "source-gcs")]
282    pub mod gcs {
283        pub use faucet_source_gcs::*;
284    }
285}
286
287// Backwards-compatible flat re-exports for existing users who depend on
288// `faucet-stream::{RestStream, Auth, ...}` without the `source::rest::` path.
289#[cfg(feature = "source-rest")]
290pub use faucet_source_rest::{
291    Auth, DEFAULT_EXPIRY_RATIO, DEFAULT_TOKEN_ENDPOINT_EXPIRY_RATIO, PaginationStyle,
292    ResponseValidator, RestStream, RestStreamConfig, fetch_oauth2_token, fetch_token_from_endpoint,
293};
294
295// ── Sink connectors ──────────────────────────────────────────────────────────
296
297pub mod sink {
298    #[cfg(feature = "sink-bigquery")]
299    pub mod bigquery {
300        pub use faucet_sink_bigquery::*;
301    }
302
303    #[cfg(feature = "sink-iceberg")]
304    pub mod iceberg {
305        pub use faucet_sink_iceberg::*;
306    }
307
308    #[cfg(feature = "sink-postgres")]
309    pub mod postgres {
310        pub use faucet_sink_postgres::*;
311    }
312
313    #[cfg(feature = "sink-jsonl")]
314    pub mod jsonl {
315        pub use faucet_sink_jsonl::*;
316    }
317
318    #[cfg(feature = "sink-snowflake")]
319    pub mod snowflake {
320        pub use faucet_sink_snowflake::*;
321    }
322
323    #[cfg(feature = "sink-mysql")]
324    pub mod mysql {
325        pub use faucet_sink_mysql::*;
326    }
327
328    #[cfg(feature = "sink-mssql")]
329    pub mod mssql {
330        pub use faucet_sink_mssql::*;
331    }
332
333    #[cfg(feature = "sink-sqlite")]
334    pub mod sqlite {
335        pub use faucet_sink_sqlite::*;
336    }
337
338    #[cfg(feature = "sink-s3")]
339    pub mod s3 {
340        pub use faucet_sink_s3::*;
341    }
342
343    #[cfg(feature = "sink-mongodb")]
344    pub mod mongodb {
345        pub use faucet_sink_mongodb::*;
346    }
347
348    #[cfg(feature = "sink-redis")]
349    pub mod redis {
350        pub use faucet_sink_redis::*;
351    }
352
353    #[cfg(feature = "sink-csv")]
354    pub mod csv {
355        pub use faucet_sink_csv::*;
356    }
357
358    #[cfg(feature = "sink-elasticsearch")]
359    pub mod elasticsearch {
360        pub use faucet_sink_elasticsearch::*;
361    }
362
363    #[cfg(feature = "sink-http")]
364    pub mod http {
365        pub use faucet_sink_http::*;
366    }
367
368    #[cfg(feature = "sink-stdout")]
369    pub mod stdout {
370        pub use faucet_sink_stdout::*;
371    }
372
373    #[cfg(feature = "sink-kafka")]
374    pub mod kafka {
375        pub use faucet_sink_kafka::*;
376    }
377
378    #[cfg(feature = "sink-parquet")]
379    pub mod parquet {
380        pub use faucet_sink_parquet::*;
381    }
382
383    #[cfg(feature = "sink-gcs")]
384    pub mod gcs {
385        pub use faucet_sink_gcs::*;
386    }
387}
388
389// ── GCS common types ─────────────────────────────────────────────────────────
390
391#[cfg(any(feature = "source-gcs", feature = "sink-gcs"))]
392pub mod common_gcs {
393    pub use faucet_common_gcs::*;
394}
395
396// ── Kafka common types ───────────────────────────────────────────────────────
397
398#[cfg(any(feature = "source-kafka", feature = "sink-kafka"))]
399pub mod common_kafka {
400    pub use faucet_common_kafka::*;
401}
402
403// ── State-store backends ─────────────────────────────────────────────────────
404
405pub mod state {
406    #[cfg(feature = "state-redis")]
407    pub mod redis {
408        pub use faucet_state_redis::*;
409    }
410
411    #[cfg(feature = "state-postgres")]
412    pub mod postgres {
413        pub use faucet_state_postgres::*;
414    }
415}
416
417// ── Lineage (OpenLineage emission) ───────────────────────────────────────────
418/// OpenLineage event emission for pipeline runs (enable the `lineage` feature;
419/// `lineage-kafka` adds the Kafka transport). The CLI wires this automatically
420/// from a `lineage:` config block; library callers can build a
421/// [`lineage::LineageEmitter`] directly.
422#[cfg(feature = "lineage")]
423pub use faucet_lineage as lineage;
424
425// ── SQL transform (embedded DuckDB) ──────────────────────────────────────────
426/// SQL-as-transform: run DuckDB SQL over each pipeline page (the `batch`
427/// relation). Enable the `transform-sql` feature. The CLI wires this via the
428/// `sql` transform; library callers build [`transform_sql::SqlTransform`] and
429/// attach it with [`TransformingSource`].
430#[cfg(feature = "transform-sql")]
431pub use faucet_transform_sql as transform_sql;