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    #[cfg(feature = "source-singer")]
183    pub mod singer {
184        pub use faucet_source_singer::*;
185    }
186}
187
188// Source modules available without source-rest (when only other sources are enabled).
189#[cfg(not(feature = "source-rest"))]
190pub mod source {
191    #[cfg(feature = "source-graphql")]
192    pub mod graphql {
193        pub use faucet_source_graphql::*;
194    }
195
196    #[cfg(feature = "source-xml")]
197    pub mod xml {
198        pub use faucet_source_xml::*;
199    }
200
201    #[cfg(feature = "source-grpc")]
202    pub mod grpc {
203        pub use faucet_source_grpc::*;
204    }
205
206    #[cfg(feature = "source-postgres")]
207    pub mod postgres {
208        pub use faucet_source_postgres::*;
209    }
210
211    #[cfg(feature = "source-postgres-cdc")]
212    pub mod postgres_cdc {
213        pub use faucet_source_postgres_cdc::*;
214    }
215
216    #[cfg(feature = "source-mysql")]
217    pub mod mysql {
218        pub use faucet_source_mysql::*;
219    }
220
221    #[cfg(feature = "source-mssql")]
222    pub mod mssql {
223        pub use faucet_source_mssql::*;
224    }
225
226    #[cfg(feature = "source-sqlite")]
227    pub mod sqlite {
228        pub use faucet_source_sqlite::*;
229    }
230
231    #[cfg(feature = "source-s3")]
232    pub mod s3 {
233        pub use faucet_source_s3::*;
234    }
235
236    #[cfg(feature = "source-mongodb")]
237    pub mod mongodb {
238        pub use faucet_source_mongodb::*;
239    }
240
241    #[cfg(feature = "source-mongodb-cdc")]
242    pub mod mongodb_cdc {
243        pub use faucet_source_mongodb_cdc::*;
244    }
245
246    #[cfg(feature = "source-mysql-cdc")]
247    pub mod mysql_cdc {
248        pub use faucet_source_mysql_cdc::*;
249    }
250
251    #[cfg(feature = "source-redis")]
252    pub mod redis {
253        pub use faucet_source_redis::*;
254    }
255
256    #[cfg(feature = "source-webhook")]
257    pub mod webhook {
258        pub use faucet_source_webhook::*;
259    }
260
261    #[cfg(feature = "source-websocket")]
262    pub mod websocket {
263        pub use faucet_source_websocket::*;
264    }
265
266    #[cfg(feature = "source-csv")]
267    pub mod csv {
268        pub use faucet_source_csv::*;
269    }
270
271    #[cfg(feature = "source-elasticsearch")]
272    pub mod elasticsearch {
273        pub use faucet_source_elasticsearch::*;
274    }
275
276    #[cfg(feature = "source-kafka")]
277    pub mod kafka {
278        pub use faucet_source_kafka::*;
279    }
280
281    #[cfg(feature = "source-parquet")]
282    pub mod parquet {
283        pub use faucet_source_parquet::*;
284    }
285
286    #[cfg(feature = "source-gcs")]
287    pub mod gcs {
288        pub use faucet_source_gcs::*;
289    }
290
291    #[cfg(feature = "source-singer")]
292    pub mod singer {
293        pub use faucet_source_singer::*;
294    }
295}
296
297// Backwards-compatible flat re-exports for existing users who depend on
298// `faucet-stream::{RestStream, Auth, ...}` without the `source::rest::` path.
299#[cfg(feature = "source-rest")]
300pub use faucet_source_rest::{
301    Auth, DEFAULT_EXPIRY_RATIO, DEFAULT_TOKEN_ENDPOINT_EXPIRY_RATIO, PaginationStyle,
302    ResponseValidator, RestStream, RestStreamConfig, fetch_oauth2_token, fetch_token_from_endpoint,
303};
304
305// ── Sink connectors ──────────────────────────────────────────────────────────
306
307pub mod sink {
308    #[cfg(feature = "sink-bigquery")]
309    pub mod bigquery {
310        pub use faucet_sink_bigquery::*;
311    }
312
313    #[cfg(feature = "sink-iceberg")]
314    pub mod iceberg {
315        pub use faucet_sink_iceberg::*;
316    }
317
318    #[cfg(feature = "sink-postgres")]
319    pub mod postgres {
320        pub use faucet_sink_postgres::*;
321    }
322
323    #[cfg(feature = "sink-jsonl")]
324    pub mod jsonl {
325        pub use faucet_sink_jsonl::*;
326    }
327
328    #[cfg(feature = "sink-snowflake")]
329    pub mod snowflake {
330        pub use faucet_sink_snowflake::*;
331    }
332
333    #[cfg(feature = "sink-mysql")]
334    pub mod mysql {
335        pub use faucet_sink_mysql::*;
336    }
337
338    #[cfg(feature = "sink-mssql")]
339    pub mod mssql {
340        pub use faucet_sink_mssql::*;
341    }
342
343    #[cfg(feature = "sink-sqlite")]
344    pub mod sqlite {
345        pub use faucet_sink_sqlite::*;
346    }
347
348    #[cfg(feature = "sink-s3")]
349    pub mod s3 {
350        pub use faucet_sink_s3::*;
351    }
352
353    #[cfg(feature = "sink-mongodb")]
354    pub mod mongodb {
355        pub use faucet_sink_mongodb::*;
356    }
357
358    #[cfg(feature = "sink-redis")]
359    pub mod redis {
360        pub use faucet_sink_redis::*;
361    }
362
363    #[cfg(feature = "sink-csv")]
364    pub mod csv {
365        pub use faucet_sink_csv::*;
366    }
367
368    #[cfg(feature = "sink-elasticsearch")]
369    pub mod elasticsearch {
370        pub use faucet_sink_elasticsearch::*;
371    }
372
373    #[cfg(feature = "sink-http")]
374    pub mod http {
375        pub use faucet_sink_http::*;
376    }
377
378    #[cfg(feature = "sink-stdout")]
379    pub mod stdout {
380        pub use faucet_sink_stdout::*;
381    }
382
383    #[cfg(feature = "sink-kafka")]
384    pub mod kafka {
385        pub use faucet_sink_kafka::*;
386    }
387
388    #[cfg(feature = "sink-parquet")]
389    pub mod parquet {
390        pub use faucet_sink_parquet::*;
391    }
392
393    #[cfg(feature = "sink-gcs")]
394    pub mod gcs {
395        pub use faucet_sink_gcs::*;
396    }
397}
398
399// ── GCS common types ─────────────────────────────────────────────────────────
400
401#[cfg(any(feature = "source-gcs", feature = "sink-gcs"))]
402pub mod common_gcs {
403    pub use faucet_common_gcs::*;
404}
405
406// ── Kafka common types ───────────────────────────────────────────────────────
407
408#[cfg(any(feature = "source-kafka", feature = "sink-kafka"))]
409pub mod common_kafka {
410    pub use faucet_common_kafka::*;
411}
412
413// ── State-store backends ─────────────────────────────────────────────────────
414
415pub mod state {
416    #[cfg(feature = "state-redis")]
417    pub mod redis {
418        pub use faucet_state_redis::*;
419    }
420
421    #[cfg(feature = "state-postgres")]
422    pub mod postgres {
423        pub use faucet_state_postgres::*;
424    }
425}
426
427// ── Lineage (OpenLineage emission) ───────────────────────────────────────────
428/// OpenLineage event emission for pipeline runs (enable the `lineage` feature;
429/// `lineage-kafka` adds the Kafka transport). The CLI wires this automatically
430/// from a `lineage:` config block; library callers can build a
431/// [`lineage::LineageEmitter`] directly.
432#[cfg(feature = "lineage")]
433pub use faucet_lineage as lineage;
434
435// ── SQL transform (embedded DuckDB) ──────────────────────────────────────────
436/// SQL-as-transform: run DuckDB SQL over each pipeline page (the `batch`
437/// relation). Enable the `transform-sql` feature. The CLI wires this via the
438/// `sql` transform; library callers build [`transform_sql::SqlTransform`] and
439/// attach it with [`TransformingSource`].
440#[cfg(feature = "transform-sql")]
441pub use faucet_transform_sql as transform_sql;