├── .github
└── workflows
│ └── ci.yml
├── .gitignore
├── .idea
├── .gitignore
├── modules.xml
├── streamgen.iml
└── vcs.xml
├── Cargo.lock
├── Cargo.toml
├── LICENSE-APACHE
├── LICENSE-MIT
├── README.md
├── resources
└── symbols.txt
└── src
├── generators
├── common_log.rs
├── mod.rs
└── schematized.rs
├── main.rs
└── writers
├── kafka
├── mod.rs
└── writer.rs
├── mod.rs
├── sse.rs
└── stdout.rs
/.github/workflows/ci.yml:
--------------------------------------------------------------------------------
1 | name: test suite
2 | on: [push, pull_request]
3 |
4 | jobs:
5 | test:
6 | name: cargo test
7 | runs-on: ubuntu-latest
8 | steps:
9 | - uses: actions/checkout@v4
10 | - uses: dtolnay/rust-toolchain@stable
11 | - run: cargo test --all-features
12 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | /target
2 |
--------------------------------------------------------------------------------
/.idea/.gitignore:
--------------------------------------------------------------------------------
1 | # Default ignored files
2 | /shelf/
3 | /workspace.xml
4 | # Editor-based HTTP Client requests
5 | /httpRequests/
6 | # Datasource local storage ignored files
7 | /dataSources/
8 | /dataSources.local.xml
9 |
--------------------------------------------------------------------------------
/.idea/modules.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/.idea/streamgen.iml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/vcs.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/Cargo.lock:
--------------------------------------------------------------------------------
1 | # This file is automatically @generated by Cargo.
2 | # It is not intended for manual editing.
3 | version = 3
4 |
5 | [[package]]
6 | name = "addr2line"
7 | version = "0.21.0"
8 | source = "registry+https://github.com/rust-lang/crates.io-index"
9 | checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb"
10 | dependencies = [
11 | "gimli",
12 | ]
13 |
14 | [[package]]
15 | name = "adler"
16 | version = "1.0.2"
17 | source = "registry+https://github.com/rust-lang/crates.io-index"
18 | checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
19 |
20 | [[package]]
21 | name = "aho-corasick"
22 | version = "1.1.2"
23 | source = "registry+https://github.com/rust-lang/crates.io-index"
24 | checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0"
25 | dependencies = [
26 | "memchr",
27 | ]
28 |
29 | [[package]]
30 | name = "android-tzdata"
31 | version = "0.1.1"
32 | source = "registry+https://github.com/rust-lang/crates.io-index"
33 | checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0"
34 |
35 | [[package]]
36 | name = "android_system_properties"
37 | version = "0.1.5"
38 | source = "registry+https://github.com/rust-lang/crates.io-index"
39 | checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311"
40 | dependencies = [
41 | "libc",
42 | ]
43 |
44 | [[package]]
45 | name = "anstream"
46 | version = "0.6.4"
47 | source = "registry+https://github.com/rust-lang/crates.io-index"
48 | checksum = "2ab91ebe16eb252986481c5b62f6098f3b698a45e34b5b98200cf20dd2484a44"
49 | dependencies = [
50 | "anstyle",
51 | "anstyle-parse",
52 | "anstyle-query",
53 | "anstyle-wincon",
54 | "colorchoice",
55 | "utf8parse",
56 | ]
57 |
58 | [[package]]
59 | name = "anstyle"
60 | version = "1.0.4"
61 | source = "registry+https://github.com/rust-lang/crates.io-index"
62 | checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87"
63 |
64 | [[package]]
65 | name = "anstyle-parse"
66 | version = "0.2.2"
67 | source = "registry+https://github.com/rust-lang/crates.io-index"
68 | checksum = "317b9a89c1868f5ea6ff1d9539a69f45dffc21ce321ac1fd1160dfa48c8e2140"
69 | dependencies = [
70 | "utf8parse",
71 | ]
72 |
73 | [[package]]
74 | name = "anstyle-query"
75 | version = "1.0.0"
76 | source = "registry+https://github.com/rust-lang/crates.io-index"
77 | checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b"
78 | dependencies = [
79 | "windows-sys",
80 | ]
81 |
82 | [[package]]
83 | name = "anstyle-wincon"
84 | version = "3.0.1"
85 | source = "registry+https://github.com/rust-lang/crates.io-index"
86 | checksum = "f0699d10d2f4d628a98ee7b57b289abbc98ff3bad977cb3152709d4bf2330628"
87 | dependencies = [
88 | "anstyle",
89 | "windows-sys",
90 | ]
91 |
92 | [[package]]
93 | name = "async-trait"
94 | version = "0.1.74"
95 | source = "registry+https://github.com/rust-lang/crates.io-index"
96 | checksum = "a66537f1bb974b254c98ed142ff995236e81b9d0fe4db0575f46612cb15eb0f9"
97 | dependencies = [
98 | "proc-macro2",
99 | "quote",
100 | "syn 2.0.39",
101 | ]
102 |
103 | [[package]]
104 | name = "autocfg"
105 | version = "1.1.0"
106 | source = "registry+https://github.com/rust-lang/crates.io-index"
107 | checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
108 |
109 | [[package]]
110 | name = "axum"
111 | version = "0.7.1"
112 | source = "registry+https://github.com/rust-lang/crates.io-index"
113 | checksum = "810a80b128d70e6ed2bdf3fe8ed72c0ae56f5f5948d01c2753282dd92a84fce8"
114 | dependencies = [
115 | "async-trait",
116 | "axum-core",
117 | "bytes",
118 | "futures-util",
119 | "http 1.0.0",
120 | "http-body",
121 | "http-body-util",
122 | "hyper",
123 | "hyper-util",
124 | "itoa",
125 | "matchit",
126 | "memchr",
127 | "mime",
128 | "percent-encoding",
129 | "pin-project-lite",
130 | "rustversion",
131 | "serde",
132 | "serde_json",
133 | "serde_path_to_error",
134 | "serde_urlencoded",
135 | "sync_wrapper",
136 | "tokio",
137 | "tower",
138 | "tower-layer",
139 | "tower-service",
140 | ]
141 |
142 | [[package]]
143 | name = "axum-core"
144 | version = "0.4.0"
145 | source = "registry+https://github.com/rust-lang/crates.io-index"
146 | checksum = "de0ddc355eab88f4955090a823715df47acf0b7660aab7a69ad5ce6301ee3b73"
147 | dependencies = [
148 | "async-trait",
149 | "bytes",
150 | "futures-util",
151 | "http 1.0.0",
152 | "http-body",
153 | "http-body-util",
154 | "mime",
155 | "pin-project-lite",
156 | "rustversion",
157 | "sync_wrapper",
158 | "tower-layer",
159 | "tower-service",
160 | ]
161 |
162 | [[package]]
163 | name = "axum-extra"
164 | version = "0.9.0"
165 | source = "registry+https://github.com/rust-lang/crates.io-index"
166 | checksum = "523ae92256049a3b02d3bb4df80152386cd97ddba0c8c5077619bdc8c4b1859b"
167 | dependencies = [
168 | "axum",
169 | "axum-core",
170 | "bytes",
171 | "futures-util",
172 | "headers",
173 | "http 1.0.0",
174 | "http-body",
175 | "http-body-util",
176 | "mime",
177 | "pin-project-lite",
178 | "serde",
179 | "tower",
180 | "tower-layer",
181 | "tower-service",
182 | ]
183 |
184 | [[package]]
185 | name = "backtrace"
186 | version = "0.3.69"
187 | source = "registry+https://github.com/rust-lang/crates.io-index"
188 | checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837"
189 | dependencies = [
190 | "addr2line",
191 | "cc",
192 | "cfg-if",
193 | "libc",
194 | "miniz_oxide",
195 | "object",
196 | "rustc-demangle",
197 | ]
198 |
199 | [[package]]
200 | name = "base64"
201 | version = "0.21.5"
202 | source = "registry+https://github.com/rust-lang/crates.io-index"
203 | checksum = "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9"
204 |
205 | [[package]]
206 | name = "bitflags"
207 | version = "1.3.2"
208 | source = "registry+https://github.com/rust-lang/crates.io-index"
209 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
210 |
211 | [[package]]
212 | name = "block-buffer"
213 | version = "0.10.4"
214 | source = "registry+https://github.com/rust-lang/crates.io-index"
215 | checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71"
216 | dependencies = [
217 | "generic-array",
218 | ]
219 |
220 | [[package]]
221 | name = "bumpalo"
222 | version = "3.14.0"
223 | source = "registry+https://github.com/rust-lang/crates.io-index"
224 | checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec"
225 |
226 | [[package]]
227 | name = "bytes"
228 | version = "1.5.0"
229 | source = "registry+https://github.com/rust-lang/crates.io-index"
230 | checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223"
231 |
232 | [[package]]
233 | name = "cc"
234 | version = "1.0.83"
235 | source = "registry+https://github.com/rust-lang/crates.io-index"
236 | checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0"
237 | dependencies = [
238 | "libc",
239 | ]
240 |
241 | [[package]]
242 | name = "cfg-if"
243 | version = "1.0.0"
244 | source = "registry+https://github.com/rust-lang/crates.io-index"
245 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
246 |
247 | [[package]]
248 | name = "chrono"
249 | version = "0.4.31"
250 | source = "registry+https://github.com/rust-lang/crates.io-index"
251 | checksum = "7f2c685bad3eb3d45a01354cedb7d5faa66194d1d58ba6e267a8de788f79db38"
252 | dependencies = [
253 | "android-tzdata",
254 | "iana-time-zone",
255 | "js-sys",
256 | "num-traits",
257 | "serde",
258 | "wasm-bindgen",
259 | "windows-targets",
260 | ]
261 |
262 | [[package]]
263 | name = "clap"
264 | version = "4.4.10"
265 | source = "registry+https://github.com/rust-lang/crates.io-index"
266 | checksum = "41fffed7514f420abec6d183b1d3acfd9099c79c3a10a06ade4f8203f1411272"
267 | dependencies = [
268 | "clap_builder",
269 | "clap_derive",
270 | ]
271 |
272 | [[package]]
273 | name = "clap_builder"
274 | version = "4.4.9"
275 | source = "registry+https://github.com/rust-lang/crates.io-index"
276 | checksum = "63361bae7eef3771745f02d8d892bec2fee5f6e34af316ba556e7f97a7069ff1"
277 | dependencies = [
278 | "anstream",
279 | "anstyle",
280 | "clap_lex",
281 | "strsim",
282 | ]
283 |
284 | [[package]]
285 | name = "clap_derive"
286 | version = "4.4.7"
287 | source = "registry+https://github.com/rust-lang/crates.io-index"
288 | checksum = "cf9804afaaf59a91e75b022a30fb7229a7901f60c755489cc61c9b423b836442"
289 | dependencies = [
290 | "heck",
291 | "proc-macro2",
292 | "quote",
293 | "syn 2.0.39",
294 | ]
295 |
296 | [[package]]
297 | name = "clap_lex"
298 | version = "0.6.0"
299 | source = "registry+https://github.com/rust-lang/crates.io-index"
300 | checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1"
301 |
302 | [[package]]
303 | name = "cmake"
304 | version = "0.1.50"
305 | source = "registry+https://github.com/rust-lang/crates.io-index"
306 | checksum = "a31c789563b815f77f4250caee12365734369f942439b7defd71e18a48197130"
307 | dependencies = [
308 | "cc",
309 | ]
310 |
311 | [[package]]
312 | name = "colorchoice"
313 | version = "1.0.0"
314 | source = "registry+https://github.com/rust-lang/crates.io-index"
315 | checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7"
316 |
317 | [[package]]
318 | name = "core-foundation-sys"
319 | version = "0.8.4"
320 | source = "registry+https://github.com/rust-lang/crates.io-index"
321 | checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa"
322 |
323 | [[package]]
324 | name = "cpufeatures"
325 | version = "0.2.11"
326 | source = "registry+https://github.com/rust-lang/crates.io-index"
327 | checksum = "ce420fe07aecd3e67c5f910618fe65e94158f6dcc0adf44e00d69ce2bdfe0fd0"
328 | dependencies = [
329 | "libc",
330 | ]
331 |
332 | [[package]]
333 | name = "crypto-common"
334 | version = "0.1.6"
335 | source = "registry+https://github.com/rust-lang/crates.io-index"
336 | checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3"
337 | dependencies = [
338 | "generic-array",
339 | "typenum",
340 | ]
341 |
342 | [[package]]
343 | name = "darling"
344 | version = "0.20.3"
345 | source = "registry+https://github.com/rust-lang/crates.io-index"
346 | checksum = "0209d94da627ab5605dcccf08bb18afa5009cfbef48d8a8b7d7bdbc79be25c5e"
347 | dependencies = [
348 | "darling_core",
349 | "darling_macro",
350 | ]
351 |
352 | [[package]]
353 | name = "darling_core"
354 | version = "0.20.3"
355 | source = "registry+https://github.com/rust-lang/crates.io-index"
356 | checksum = "177e3443818124b357d8e76f53be906d60937f0d3a90773a664fa63fa253e621"
357 | dependencies = [
358 | "fnv",
359 | "ident_case",
360 | "proc-macro2",
361 | "quote",
362 | "strsim",
363 | "syn 2.0.39",
364 | ]
365 |
366 | [[package]]
367 | name = "darling_macro"
368 | version = "0.20.3"
369 | source = "registry+https://github.com/rust-lang/crates.io-index"
370 | checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5"
371 | dependencies = [
372 | "darling_core",
373 | "quote",
374 | "syn 2.0.39",
375 | ]
376 |
377 | [[package]]
378 | name = "deunicode"
379 | version = "1.4.1"
380 | source = "registry+https://github.com/rust-lang/crates.io-index"
381 | checksum = "6a1abaf4d861455be59f64fd2b55606cb151fce304ede7165f410243ce96bde6"
382 |
383 | [[package]]
384 | name = "digest"
385 | version = "0.10.7"
386 | source = "registry+https://github.com/rust-lang/crates.io-index"
387 | checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292"
388 | dependencies = [
389 | "block-buffer",
390 | "crypto-common",
391 | ]
392 |
393 | [[package]]
394 | name = "dummy"
395 | version = "0.7.0"
396 | source = "registry+https://github.com/rust-lang/crates.io-index"
397 | checksum = "7e57e12b69e57fad516e01e2b3960f122696fdb13420e1a88ed8e210316f2876"
398 | dependencies = [
399 | "darling",
400 | "proc-macro2",
401 | "quote",
402 | "syn 2.0.39",
403 | ]
404 |
405 | [[package]]
406 | name = "equivalent"
407 | version = "1.0.1"
408 | source = "registry+https://github.com/rust-lang/crates.io-index"
409 | checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
410 |
411 | [[package]]
412 | name = "fake"
413 | version = "2.9.1"
414 | source = "registry+https://github.com/rust-lang/crates.io-index"
415 | checksum = "26221445034074d46b276e13eb97a265ebdb8ed8da705c4dddd3dd20b66b45d2"
416 | dependencies = [
417 | "deunicode",
418 | "dummy",
419 | "http 0.2.11",
420 | "rand",
421 | "url-escape",
422 | ]
423 |
424 | [[package]]
425 | name = "fnv"
426 | version = "1.0.7"
427 | source = "registry+https://github.com/rust-lang/crates.io-index"
428 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
429 |
430 | [[package]]
431 | name = "form_urlencoded"
432 | version = "1.2.1"
433 | source = "registry+https://github.com/rust-lang/crates.io-index"
434 | checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456"
435 | dependencies = [
436 | "percent-encoding",
437 | ]
438 |
439 | [[package]]
440 | name = "futures-channel"
441 | version = "0.3.29"
442 | source = "registry+https://github.com/rust-lang/crates.io-index"
443 | checksum = "ff4dd66668b557604244583e3e1e1eada8c5c2e96a6d0d6653ede395b78bbacb"
444 | dependencies = [
445 | "futures-core",
446 | ]
447 |
448 | [[package]]
449 | name = "futures-core"
450 | version = "0.3.29"
451 | source = "registry+https://github.com/rust-lang/crates.io-index"
452 | checksum = "eb1d22c66e66d9d72e1758f0bd7d4fd0bee04cad842ee34587d68c07e45d088c"
453 |
454 | [[package]]
455 | name = "futures-sink"
456 | version = "0.3.29"
457 | source = "registry+https://github.com/rust-lang/crates.io-index"
458 | checksum = "e36d3378ee38c2a36ad710c5d30c2911d752cb941c00c72dbabfb786a7970817"
459 |
460 | [[package]]
461 | name = "futures-task"
462 | version = "0.3.29"
463 | source = "registry+https://github.com/rust-lang/crates.io-index"
464 | checksum = "efd193069b0ddadc69c46389b740bbccdd97203899b48d09c5f7969591d6bae2"
465 |
466 | [[package]]
467 | name = "futures-util"
468 | version = "0.3.29"
469 | source = "registry+https://github.com/rust-lang/crates.io-index"
470 | checksum = "a19526d624e703a3179b3d322efec918b6246ea0fa51d41124525f00f1cc8104"
471 | dependencies = [
472 | "futures-core",
473 | "futures-task",
474 | "pin-project-lite",
475 | "pin-utils",
476 | ]
477 |
478 | [[package]]
479 | name = "generic-array"
480 | version = "0.14.7"
481 | source = "registry+https://github.com/rust-lang/crates.io-index"
482 | checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a"
483 | dependencies = [
484 | "typenum",
485 | "version_check",
486 | ]
487 |
488 | [[package]]
489 | name = "getrandom"
490 | version = "0.2.11"
491 | source = "registry+https://github.com/rust-lang/crates.io-index"
492 | checksum = "fe9006bed769170c11f845cf00c7c1e9092aeb3f268e007c3e760ac68008070f"
493 | dependencies = [
494 | "cfg-if",
495 | "libc",
496 | "wasi",
497 | ]
498 |
499 | [[package]]
500 | name = "gimli"
501 | version = "0.28.1"
502 | source = "registry+https://github.com/rust-lang/crates.io-index"
503 | checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253"
504 |
505 | [[package]]
506 | name = "h2"
507 | version = "0.4.0"
508 | source = "registry+https://github.com/rust-lang/crates.io-index"
509 | checksum = "e1d308f63daf4181410c242d34c11f928dcb3aa105852019e043c9d1f4e4368a"
510 | dependencies = [
511 | "bytes",
512 | "fnv",
513 | "futures-core",
514 | "futures-sink",
515 | "futures-util",
516 | "http 1.0.0",
517 | "indexmap",
518 | "slab",
519 | "tokio",
520 | "tokio-util",
521 | "tracing",
522 | ]
523 |
524 | [[package]]
525 | name = "hashbrown"
526 | version = "0.14.3"
527 | source = "registry+https://github.com/rust-lang/crates.io-index"
528 | checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604"
529 |
530 | [[package]]
531 | name = "headers"
532 | version = "0.4.0"
533 | source = "registry+https://github.com/rust-lang/crates.io-index"
534 | checksum = "322106e6bd0cba2d5ead589ddb8150a13d7c4217cf80d7c4f682ca994ccc6aa9"
535 | dependencies = [
536 | "base64",
537 | "bytes",
538 | "headers-core",
539 | "http 1.0.0",
540 | "httpdate",
541 | "mime",
542 | "sha1",
543 | ]
544 |
545 | [[package]]
546 | name = "headers-core"
547 | version = "0.3.0"
548 | source = "registry+https://github.com/rust-lang/crates.io-index"
549 | checksum = "54b4a22553d4242c49fddb9ba998a99962b5cc6f22cb5a3482bec22522403ce4"
550 | dependencies = [
551 | "http 1.0.0",
552 | ]
553 |
554 | [[package]]
555 | name = "heck"
556 | version = "0.4.1"
557 | source = "registry+https://github.com/rust-lang/crates.io-index"
558 | checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8"
559 |
560 | [[package]]
561 | name = "hermit-abi"
562 | version = "0.3.3"
563 | source = "registry+https://github.com/rust-lang/crates.io-index"
564 | checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7"
565 |
566 | [[package]]
567 | name = "http"
568 | version = "0.2.11"
569 | source = "registry+https://github.com/rust-lang/crates.io-index"
570 | checksum = "8947b1a6fad4393052c7ba1f4cd97bed3e953a95c79c92ad9b051a04611d9fbb"
571 | dependencies = [
572 | "bytes",
573 | "fnv",
574 | "itoa",
575 | ]
576 |
577 | [[package]]
578 | name = "http"
579 | version = "1.0.0"
580 | source = "registry+https://github.com/rust-lang/crates.io-index"
581 | checksum = "b32afd38673a8016f7c9ae69e5af41a58f81b1d31689040f2f1959594ce194ea"
582 | dependencies = [
583 | "bytes",
584 | "fnv",
585 | "itoa",
586 | ]
587 |
588 | [[package]]
589 | name = "http-body"
590 | version = "1.0.0"
591 | source = "registry+https://github.com/rust-lang/crates.io-index"
592 | checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643"
593 | dependencies = [
594 | "bytes",
595 | "http 1.0.0",
596 | ]
597 |
598 | [[package]]
599 | name = "http-body-util"
600 | version = "0.1.0"
601 | source = "registry+https://github.com/rust-lang/crates.io-index"
602 | checksum = "41cb79eb393015dadd30fc252023adb0b2400a0caee0fa2a077e6e21a551e840"
603 | dependencies = [
604 | "bytes",
605 | "futures-util",
606 | "http 1.0.0",
607 | "http-body",
608 | "pin-project-lite",
609 | ]
610 |
611 | [[package]]
612 | name = "httparse"
613 | version = "1.8.0"
614 | source = "registry+https://github.com/rust-lang/crates.io-index"
615 | checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904"
616 |
617 | [[package]]
618 | name = "httpdate"
619 | version = "1.0.3"
620 | source = "registry+https://github.com/rust-lang/crates.io-index"
621 | checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9"
622 |
623 | [[package]]
624 | name = "hyper"
625 | version = "1.0.1"
626 | source = "registry+https://github.com/rust-lang/crates.io-index"
627 | checksum = "403f9214f3e703236b221f1a9cd88ec8b4adfa5296de01ab96216361f4692f56"
628 | dependencies = [
629 | "bytes",
630 | "futures-channel",
631 | "futures-util",
632 | "h2",
633 | "http 1.0.0",
634 | "http-body",
635 | "httparse",
636 | "httpdate",
637 | "itoa",
638 | "pin-project-lite",
639 | "tokio",
640 | ]
641 |
642 | [[package]]
643 | name = "hyper-util"
644 | version = "0.1.1"
645 | source = "registry+https://github.com/rust-lang/crates.io-index"
646 | checksum = "9ca339002caeb0d159cc6e023dff48e199f081e42fa039895c7c6f38b37f2e9d"
647 | dependencies = [
648 | "bytes",
649 | "futures-channel",
650 | "futures-util",
651 | "http 1.0.0",
652 | "http-body",
653 | "hyper",
654 | "pin-project-lite",
655 | "socket2",
656 | "tokio",
657 | "tower",
658 | "tower-service",
659 | "tracing",
660 | ]
661 |
662 | [[package]]
663 | name = "iana-time-zone"
664 | version = "0.1.58"
665 | source = "registry+https://github.com/rust-lang/crates.io-index"
666 | checksum = "8326b86b6cff230b97d0d312a6c40a60726df3332e721f72a1b035f451663b20"
667 | dependencies = [
668 | "android_system_properties",
669 | "core-foundation-sys",
670 | "iana-time-zone-haiku",
671 | "js-sys",
672 | "wasm-bindgen",
673 | "windows-core",
674 | ]
675 |
676 | [[package]]
677 | name = "iana-time-zone-haiku"
678 | version = "0.1.2"
679 | source = "registry+https://github.com/rust-lang/crates.io-index"
680 | checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f"
681 | dependencies = [
682 | "cc",
683 | ]
684 |
685 | [[package]]
686 | name = "ident_case"
687 | version = "1.0.1"
688 | source = "registry+https://github.com/rust-lang/crates.io-index"
689 | checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39"
690 |
691 | [[package]]
692 | name = "indexmap"
693 | version = "2.1.0"
694 | source = "registry+https://github.com/rust-lang/crates.io-index"
695 | checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f"
696 | dependencies = [
697 | "equivalent",
698 | "hashbrown",
699 | ]
700 |
701 | [[package]]
702 | name = "itoa"
703 | version = "1.0.9"
704 | source = "registry+https://github.com/rust-lang/crates.io-index"
705 | checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38"
706 |
707 | [[package]]
708 | name = "js-sys"
709 | version = "0.3.66"
710 | source = "registry+https://github.com/rust-lang/crates.io-index"
711 | checksum = "cee9c64da59eae3b50095c18d3e74f8b73c0b86d2792824ff01bbce68ba229ca"
712 | dependencies = [
713 | "wasm-bindgen",
714 | ]
715 |
716 | [[package]]
717 | name = "lazy_static"
718 | version = "1.4.0"
719 | source = "registry+https://github.com/rust-lang/crates.io-index"
720 | checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
721 |
722 | [[package]]
723 | name = "libc"
724 | version = "0.2.150"
725 | source = "registry+https://github.com/rust-lang/crates.io-index"
726 | checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c"
727 |
728 | [[package]]
729 | name = "libz-sys"
730 | version = "1.1.12"
731 | source = "registry+https://github.com/rust-lang/crates.io-index"
732 | checksum = "d97137b25e321a73eef1418d1d5d2eda4d77e12813f8e6dead84bc52c5870a7b"
733 | dependencies = [
734 | "cc",
735 | "libc",
736 | "pkg-config",
737 | "vcpkg",
738 | ]
739 |
740 | [[package]]
741 | name = "lock_api"
742 | version = "0.4.11"
743 | source = "registry+https://github.com/rust-lang/crates.io-index"
744 | checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45"
745 | dependencies = [
746 | "autocfg",
747 | "scopeguard",
748 | ]
749 |
750 | [[package]]
751 | name = "log"
752 | version = "0.4.20"
753 | source = "registry+https://github.com/rust-lang/crates.io-index"
754 | checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f"
755 |
756 | [[package]]
757 | name = "matchers"
758 | version = "0.1.0"
759 | source = "registry+https://github.com/rust-lang/crates.io-index"
760 | checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558"
761 | dependencies = [
762 | "regex-automata 0.1.10",
763 | ]
764 |
765 | [[package]]
766 | name = "matchit"
767 | version = "0.7.3"
768 | source = "registry+https://github.com/rust-lang/crates.io-index"
769 | checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94"
770 |
771 | [[package]]
772 | name = "memchr"
773 | version = "2.6.4"
774 | source = "registry+https://github.com/rust-lang/crates.io-index"
775 | checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167"
776 |
777 | [[package]]
778 | name = "mime"
779 | version = "0.3.17"
780 | source = "registry+https://github.com/rust-lang/crates.io-index"
781 | checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
782 |
783 | [[package]]
784 | name = "miniz_oxide"
785 | version = "0.7.1"
786 | source = "registry+https://github.com/rust-lang/crates.io-index"
787 | checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7"
788 | dependencies = [
789 | "adler",
790 | ]
791 |
792 | [[package]]
793 | name = "mio"
794 | version = "0.8.9"
795 | source = "registry+https://github.com/rust-lang/crates.io-index"
796 | checksum = "3dce281c5e46beae905d4de1870d8b1509a9142b62eedf18b443b011ca8343d0"
797 | dependencies = [
798 | "libc",
799 | "wasi",
800 | "windows-sys",
801 | ]
802 |
803 | [[package]]
804 | name = "nu-ansi-term"
805 | version = "0.46.0"
806 | source = "registry+https://github.com/rust-lang/crates.io-index"
807 | checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84"
808 | dependencies = [
809 | "overload",
810 | "winapi",
811 | ]
812 |
813 | [[package]]
814 | name = "num-traits"
815 | version = "0.2.17"
816 | source = "registry+https://github.com/rust-lang/crates.io-index"
817 | checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c"
818 | dependencies = [
819 | "autocfg",
820 | ]
821 |
822 | [[package]]
823 | name = "num_cpus"
824 | version = "1.16.0"
825 | source = "registry+https://github.com/rust-lang/crates.io-index"
826 | checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43"
827 | dependencies = [
828 | "hermit-abi",
829 | "libc",
830 | ]
831 |
832 | [[package]]
833 | name = "num_enum"
834 | version = "0.5.11"
835 | source = "registry+https://github.com/rust-lang/crates.io-index"
836 | checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9"
837 | dependencies = [
838 | "num_enum_derive",
839 | ]
840 |
841 | [[package]]
842 | name = "num_enum_derive"
843 | version = "0.5.11"
844 | source = "registry+https://github.com/rust-lang/crates.io-index"
845 | checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799"
846 | dependencies = [
847 | "proc-macro-crate",
848 | "proc-macro2",
849 | "quote",
850 | "syn 1.0.109",
851 | ]
852 |
853 | [[package]]
854 | name = "object"
855 | version = "0.32.1"
856 | source = "registry+https://github.com/rust-lang/crates.io-index"
857 | checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0"
858 | dependencies = [
859 | "memchr",
860 | ]
861 |
862 | [[package]]
863 | name = "once_cell"
864 | version = "1.18.0"
865 | source = "registry+https://github.com/rust-lang/crates.io-index"
866 | checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d"
867 |
868 | [[package]]
869 | name = "overload"
870 | version = "0.1.1"
871 | source = "registry+https://github.com/rust-lang/crates.io-index"
872 | checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39"
873 |
874 | [[package]]
875 | name = "parking_lot"
876 | version = "0.12.1"
877 | source = "registry+https://github.com/rust-lang/crates.io-index"
878 | checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f"
879 | dependencies = [
880 | "lock_api",
881 | "parking_lot_core",
882 | ]
883 |
884 | [[package]]
885 | name = "parking_lot_core"
886 | version = "0.9.9"
887 | source = "registry+https://github.com/rust-lang/crates.io-index"
888 | checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e"
889 | dependencies = [
890 | "cfg-if",
891 | "libc",
892 | "redox_syscall",
893 | "smallvec",
894 | "windows-targets",
895 | ]
896 |
897 | [[package]]
898 | name = "percent-encoding"
899 | version = "2.3.1"
900 | source = "registry+https://github.com/rust-lang/crates.io-index"
901 | checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e"
902 |
903 | [[package]]
904 | name = "pin-project"
905 | version = "1.1.3"
906 | source = "registry+https://github.com/rust-lang/crates.io-index"
907 | checksum = "fda4ed1c6c173e3fc7a83629421152e01d7b1f9b7f65fb301e490e8cfc656422"
908 | dependencies = [
909 | "pin-project-internal",
910 | ]
911 |
912 | [[package]]
913 | name = "pin-project-internal"
914 | version = "1.1.3"
915 | source = "registry+https://github.com/rust-lang/crates.io-index"
916 | checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405"
917 | dependencies = [
918 | "proc-macro2",
919 | "quote",
920 | "syn 2.0.39",
921 | ]
922 |
923 | [[package]]
924 | name = "pin-project-lite"
925 | version = "0.2.13"
926 | source = "registry+https://github.com/rust-lang/crates.io-index"
927 | checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58"
928 |
929 | [[package]]
930 | name = "pin-utils"
931 | version = "0.1.0"
932 | source = "registry+https://github.com/rust-lang/crates.io-index"
933 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
934 |
935 | [[package]]
936 | name = "pkg-config"
937 | version = "0.3.27"
938 | source = "registry+https://github.com/rust-lang/crates.io-index"
939 | checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964"
940 |
941 | [[package]]
942 | name = "ppv-lite86"
943 | version = "0.2.17"
944 | source = "registry+https://github.com/rust-lang/crates.io-index"
945 | checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de"
946 |
947 | [[package]]
948 | name = "proc-macro-crate"
949 | version = "1.3.1"
950 | source = "registry+https://github.com/rust-lang/crates.io-index"
951 | checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919"
952 | dependencies = [
953 | "once_cell",
954 | "toml_edit",
955 | ]
956 |
957 | [[package]]
958 | name = "proc-macro2"
959 | version = "1.0.70"
960 | source = "registry+https://github.com/rust-lang/crates.io-index"
961 | checksum = "39278fbbf5fb4f646ce651690877f89d1c5811a3d4acb27700c1cb3cdb78fd3b"
962 | dependencies = [
963 | "unicode-ident",
964 | ]
965 |
966 | [[package]]
967 | name = "quote"
968 | version = "1.0.33"
969 | source = "registry+https://github.com/rust-lang/crates.io-index"
970 | checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae"
971 | dependencies = [
972 | "proc-macro2",
973 | ]
974 |
975 | [[package]]
976 | name = "rand"
977 | version = "0.8.5"
978 | source = "registry+https://github.com/rust-lang/crates.io-index"
979 | checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
980 | dependencies = [
981 | "libc",
982 | "rand_chacha",
983 | "rand_core",
984 | ]
985 |
986 | [[package]]
987 | name = "rand_chacha"
988 | version = "0.3.1"
989 | source = "registry+https://github.com/rust-lang/crates.io-index"
990 | checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
991 | dependencies = [
992 | "ppv-lite86",
993 | "rand_core",
994 | ]
995 |
996 | [[package]]
997 | name = "rand_core"
998 | version = "0.6.4"
999 | source = "registry+https://github.com/rust-lang/crates.io-index"
1000 | checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
1001 | dependencies = [
1002 | "getrandom",
1003 | ]
1004 |
1005 | [[package]]
1006 | name = "rdkafka"
1007 | version = "0.36.0"
1008 | source = "registry+https://github.com/rust-lang/crates.io-index"
1009 | checksum = "d54f02a5a40220f8a2dfa47ddb38ba9064475a5807a69504b6f91711df2eea63"
1010 | dependencies = [
1011 | "futures-channel",
1012 | "futures-util",
1013 | "libc",
1014 | "log",
1015 | "rdkafka-sys",
1016 | "serde",
1017 | "serde_derive",
1018 | "serde_json",
1019 | "slab",
1020 | "tokio",
1021 | ]
1022 |
1023 | [[package]]
1024 | name = "rdkafka-sys"
1025 | version = "4.7.0+2.3.0"
1026 | source = "registry+https://github.com/rust-lang/crates.io-index"
1027 | checksum = "55e0d2f9ba6253f6ec72385e453294f8618e9e15c2c6aba2a5c01ccf9622d615"
1028 | dependencies = [
1029 | "cmake",
1030 | "libc",
1031 | "libz-sys",
1032 | "num_enum",
1033 | "pkg-config",
1034 | ]
1035 |
1036 | [[package]]
1037 | name = "redox_syscall"
1038 | version = "0.4.1"
1039 | source = "registry+https://github.com/rust-lang/crates.io-index"
1040 | checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa"
1041 | dependencies = [
1042 | "bitflags",
1043 | ]
1044 |
1045 | [[package]]
1046 | name = "regex"
1047 | version = "1.10.2"
1048 | source = "registry+https://github.com/rust-lang/crates.io-index"
1049 | checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343"
1050 | dependencies = [
1051 | "aho-corasick",
1052 | "memchr",
1053 | "regex-automata 0.4.3",
1054 | "regex-syntax 0.8.2",
1055 | ]
1056 |
1057 | [[package]]
1058 | name = "regex-automata"
1059 | version = "0.1.10"
1060 | source = "registry+https://github.com/rust-lang/crates.io-index"
1061 | checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132"
1062 | dependencies = [
1063 | "regex-syntax 0.6.29",
1064 | ]
1065 |
1066 | [[package]]
1067 | name = "regex-automata"
1068 | version = "0.4.3"
1069 | source = "registry+https://github.com/rust-lang/crates.io-index"
1070 | checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f"
1071 | dependencies = [
1072 | "aho-corasick",
1073 | "memchr",
1074 | "regex-syntax 0.8.2",
1075 | ]
1076 |
1077 | [[package]]
1078 | name = "regex-syntax"
1079 | version = "0.6.29"
1080 | source = "registry+https://github.com/rust-lang/crates.io-index"
1081 | checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1"
1082 |
1083 | [[package]]
1084 | name = "regex-syntax"
1085 | version = "0.8.2"
1086 | source = "registry+https://github.com/rust-lang/crates.io-index"
1087 | checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f"
1088 |
1089 | [[package]]
1090 | name = "rustc-demangle"
1091 | version = "0.1.23"
1092 | source = "registry+https://github.com/rust-lang/crates.io-index"
1093 | checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76"
1094 |
1095 | [[package]]
1096 | name = "rustversion"
1097 | version = "1.0.14"
1098 | source = "registry+https://github.com/rust-lang/crates.io-index"
1099 | checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4"
1100 |
1101 | [[package]]
1102 | name = "ryu"
1103 | version = "1.0.15"
1104 | source = "registry+https://github.com/rust-lang/crates.io-index"
1105 | checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741"
1106 |
1107 | [[package]]
1108 | name = "scopeguard"
1109 | version = "1.2.0"
1110 | source = "registry+https://github.com/rust-lang/crates.io-index"
1111 | checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
1112 |
1113 | [[package]]
1114 | name = "serde"
1115 | version = "1.0.193"
1116 | source = "registry+https://github.com/rust-lang/crates.io-index"
1117 | checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89"
1118 | dependencies = [
1119 | "serde_derive",
1120 | ]
1121 |
1122 | [[package]]
1123 | name = "serde_derive"
1124 | version = "1.0.193"
1125 | source = "registry+https://github.com/rust-lang/crates.io-index"
1126 | checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3"
1127 | dependencies = [
1128 | "proc-macro2",
1129 | "quote",
1130 | "syn 2.0.39",
1131 | ]
1132 |
1133 | [[package]]
1134 | name = "serde_json"
1135 | version = "1.0.108"
1136 | source = "registry+https://github.com/rust-lang/crates.io-index"
1137 | checksum = "3d1c7e3eac408d115102c4c24ad393e0821bb3a5df4d506a80f85f7a742a526b"
1138 | dependencies = [
1139 | "itoa",
1140 | "ryu",
1141 | "serde",
1142 | ]
1143 |
1144 | [[package]]
1145 | name = "serde_path_to_error"
1146 | version = "0.1.14"
1147 | source = "registry+https://github.com/rust-lang/crates.io-index"
1148 | checksum = "4beec8bce849d58d06238cb50db2e1c417cfeafa4c63f692b15c82b7c80f8335"
1149 | dependencies = [
1150 | "itoa",
1151 | "serde",
1152 | ]
1153 |
1154 | [[package]]
1155 | name = "serde_urlencoded"
1156 | version = "0.7.1"
1157 | source = "registry+https://github.com/rust-lang/crates.io-index"
1158 | checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd"
1159 | dependencies = [
1160 | "form_urlencoded",
1161 | "itoa",
1162 | "ryu",
1163 | "serde",
1164 | ]
1165 |
1166 | [[package]]
1167 | name = "sha1"
1168 | version = "0.10.6"
1169 | source = "registry+https://github.com/rust-lang/crates.io-index"
1170 | checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba"
1171 | dependencies = [
1172 | "cfg-if",
1173 | "cpufeatures",
1174 | "digest",
1175 | ]
1176 |
1177 | [[package]]
1178 | name = "sharded-slab"
1179 | version = "0.1.7"
1180 | source = "registry+https://github.com/rust-lang/crates.io-index"
1181 | checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6"
1182 | dependencies = [
1183 | "lazy_static",
1184 | ]
1185 |
1186 | [[package]]
1187 | name = "signal-hook-registry"
1188 | version = "1.4.1"
1189 | source = "registry+https://github.com/rust-lang/crates.io-index"
1190 | checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1"
1191 | dependencies = [
1192 | "libc",
1193 | ]
1194 |
1195 | [[package]]
1196 | name = "slab"
1197 | version = "0.4.9"
1198 | source = "registry+https://github.com/rust-lang/crates.io-index"
1199 | checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67"
1200 | dependencies = [
1201 | "autocfg",
1202 | ]
1203 |
1204 | [[package]]
1205 | name = "smallvec"
1206 | version = "1.11.2"
1207 | source = "registry+https://github.com/rust-lang/crates.io-index"
1208 | checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970"
1209 |
1210 | [[package]]
1211 | name = "socket2"
1212 | version = "0.5.5"
1213 | source = "registry+https://github.com/rust-lang/crates.io-index"
1214 | checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9"
1215 | dependencies = [
1216 | "libc",
1217 | "windows-sys",
1218 | ]
1219 |
1220 | [[package]]
1221 | name = "streamgen"
1222 | version = "0.1.0"
1223 | dependencies = [
1224 | "async-trait",
1225 | "axum",
1226 | "axum-extra",
1227 | "chrono",
1228 | "clap",
1229 | "fake",
1230 | "headers",
1231 | "http 1.0.0",
1232 | "rand",
1233 | "rdkafka",
1234 | "serde",
1235 | "serde_json",
1236 | "tokio",
1237 | "tokio-stream",
1238 | "tracing",
1239 | "tracing-subscriber",
1240 | "uuid",
1241 | ]
1242 |
1243 | [[package]]
1244 | name = "strsim"
1245 | version = "0.10.0"
1246 | source = "registry+https://github.com/rust-lang/crates.io-index"
1247 | checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623"
1248 |
1249 | [[package]]
1250 | name = "syn"
1251 | version = "1.0.109"
1252 | source = "registry+https://github.com/rust-lang/crates.io-index"
1253 | checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
1254 | dependencies = [
1255 | "proc-macro2",
1256 | "quote",
1257 | "unicode-ident",
1258 | ]
1259 |
1260 | [[package]]
1261 | name = "syn"
1262 | version = "2.0.39"
1263 | source = "registry+https://github.com/rust-lang/crates.io-index"
1264 | checksum = "23e78b90f2fcf45d3e842032ce32e3f2d1545ba6636271dcbf24fa306d87be7a"
1265 | dependencies = [
1266 | "proc-macro2",
1267 | "quote",
1268 | "unicode-ident",
1269 | ]
1270 |
1271 | [[package]]
1272 | name = "sync_wrapper"
1273 | version = "0.1.2"
1274 | source = "registry+https://github.com/rust-lang/crates.io-index"
1275 | checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160"
1276 |
1277 | [[package]]
1278 | name = "thread_local"
1279 | version = "1.1.7"
1280 | source = "registry+https://github.com/rust-lang/crates.io-index"
1281 | checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152"
1282 | dependencies = [
1283 | "cfg-if",
1284 | "once_cell",
1285 | ]
1286 |
1287 | [[package]]
1288 | name = "tokio"
1289 | version = "1.34.0"
1290 | source = "registry+https://github.com/rust-lang/crates.io-index"
1291 | checksum = "d0c014766411e834f7af5b8f4cf46257aab4036ca95e9d2c144a10f59ad6f5b9"
1292 | dependencies = [
1293 | "backtrace",
1294 | "bytes",
1295 | "libc",
1296 | "mio",
1297 | "num_cpus",
1298 | "parking_lot",
1299 | "pin-project-lite",
1300 | "signal-hook-registry",
1301 | "socket2",
1302 | "tokio-macros",
1303 | "windows-sys",
1304 | ]
1305 |
1306 | [[package]]
1307 | name = "tokio-macros"
1308 | version = "2.2.0"
1309 | source = "registry+https://github.com/rust-lang/crates.io-index"
1310 | checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b"
1311 | dependencies = [
1312 | "proc-macro2",
1313 | "quote",
1314 | "syn 2.0.39",
1315 | ]
1316 |
1317 | [[package]]
1318 | name = "tokio-stream"
1319 | version = "0.1.14"
1320 | source = "registry+https://github.com/rust-lang/crates.io-index"
1321 | checksum = "397c988d37662c7dda6d2208364a706264bf3d6138b11d436cbac0ad38832842"
1322 | dependencies = [
1323 | "futures-core",
1324 | "pin-project-lite",
1325 | "tokio",
1326 | "tokio-util",
1327 | ]
1328 |
1329 | [[package]]
1330 | name = "tokio-util"
1331 | version = "0.7.10"
1332 | source = "registry+https://github.com/rust-lang/crates.io-index"
1333 | checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15"
1334 | dependencies = [
1335 | "bytes",
1336 | "futures-core",
1337 | "futures-sink",
1338 | "pin-project-lite",
1339 | "tokio",
1340 | "tracing",
1341 | ]
1342 |
1343 | [[package]]
1344 | name = "toml_datetime"
1345 | version = "0.6.5"
1346 | source = "registry+https://github.com/rust-lang/crates.io-index"
1347 | checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1"
1348 |
1349 | [[package]]
1350 | name = "toml_edit"
1351 | version = "0.19.15"
1352 | source = "registry+https://github.com/rust-lang/crates.io-index"
1353 | checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421"
1354 | dependencies = [
1355 | "indexmap",
1356 | "toml_datetime",
1357 | "winnow",
1358 | ]
1359 |
1360 | [[package]]
1361 | name = "tower"
1362 | version = "0.4.13"
1363 | source = "registry+https://github.com/rust-lang/crates.io-index"
1364 | checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c"
1365 | dependencies = [
1366 | "futures-core",
1367 | "futures-util",
1368 | "pin-project",
1369 | "pin-project-lite",
1370 | "tokio",
1371 | "tower-layer",
1372 | "tower-service",
1373 | "tracing",
1374 | ]
1375 |
1376 | [[package]]
1377 | name = "tower-layer"
1378 | version = "0.3.2"
1379 | source = "registry+https://github.com/rust-lang/crates.io-index"
1380 | checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0"
1381 |
1382 | [[package]]
1383 | name = "tower-service"
1384 | version = "0.3.2"
1385 | source = "registry+https://github.com/rust-lang/crates.io-index"
1386 | checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52"
1387 |
1388 | [[package]]
1389 | name = "tracing"
1390 | version = "0.1.40"
1391 | source = "registry+https://github.com/rust-lang/crates.io-index"
1392 | checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef"
1393 | dependencies = [
1394 | "log",
1395 | "pin-project-lite",
1396 | "tracing-attributes",
1397 | "tracing-core",
1398 | ]
1399 |
1400 | [[package]]
1401 | name = "tracing-attributes"
1402 | version = "0.1.27"
1403 | source = "registry+https://github.com/rust-lang/crates.io-index"
1404 | checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7"
1405 | dependencies = [
1406 | "proc-macro2",
1407 | "quote",
1408 | "syn 2.0.39",
1409 | ]
1410 |
1411 | [[package]]
1412 | name = "tracing-core"
1413 | version = "0.1.32"
1414 | source = "registry+https://github.com/rust-lang/crates.io-index"
1415 | checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54"
1416 | dependencies = [
1417 | "once_cell",
1418 | "valuable",
1419 | ]
1420 |
1421 | [[package]]
1422 | name = "tracing-log"
1423 | version = "0.2.0"
1424 | source = "registry+https://github.com/rust-lang/crates.io-index"
1425 | checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3"
1426 | dependencies = [
1427 | "log",
1428 | "once_cell",
1429 | "tracing-core",
1430 | ]
1431 |
1432 | [[package]]
1433 | name = "tracing-subscriber"
1434 | version = "0.3.18"
1435 | source = "registry+https://github.com/rust-lang/crates.io-index"
1436 | checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b"
1437 | dependencies = [
1438 | "matchers",
1439 | "nu-ansi-term",
1440 | "once_cell",
1441 | "regex",
1442 | "sharded-slab",
1443 | "smallvec",
1444 | "thread_local",
1445 | "tracing",
1446 | "tracing-core",
1447 | "tracing-log",
1448 | ]
1449 |
1450 | [[package]]
1451 | name = "typenum"
1452 | version = "1.17.0"
1453 | source = "registry+https://github.com/rust-lang/crates.io-index"
1454 | checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825"
1455 |
1456 | [[package]]
1457 | name = "unicode-ident"
1458 | version = "1.0.12"
1459 | source = "registry+https://github.com/rust-lang/crates.io-index"
1460 | checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b"
1461 |
1462 | [[package]]
1463 | name = "url-escape"
1464 | version = "0.1.1"
1465 | source = "registry+https://github.com/rust-lang/crates.io-index"
1466 | checksum = "44e0ce4d1246d075ca5abec4b41d33e87a6054d08e2366b63205665e950db218"
1467 | dependencies = [
1468 | "percent-encoding",
1469 | ]
1470 |
1471 | [[package]]
1472 | name = "utf8parse"
1473 | version = "0.2.1"
1474 | source = "registry+https://github.com/rust-lang/crates.io-index"
1475 | checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a"
1476 |
1477 | [[package]]
1478 | name = "uuid"
1479 | version = "1.6.1"
1480 | source = "registry+https://github.com/rust-lang/crates.io-index"
1481 | checksum = "5e395fcf16a7a3d8127ec99782007af141946b4795001f876d54fb0d55978560"
1482 | dependencies = [
1483 | "getrandom",
1484 | ]
1485 |
1486 | [[package]]
1487 | name = "valuable"
1488 | version = "0.1.0"
1489 | source = "registry+https://github.com/rust-lang/crates.io-index"
1490 | checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d"
1491 |
1492 | [[package]]
1493 | name = "vcpkg"
1494 | version = "0.2.15"
1495 | source = "registry+https://github.com/rust-lang/crates.io-index"
1496 | checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426"
1497 |
1498 | [[package]]
1499 | name = "version_check"
1500 | version = "0.9.4"
1501 | source = "registry+https://github.com/rust-lang/crates.io-index"
1502 | checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
1503 |
1504 | [[package]]
1505 | name = "wasi"
1506 | version = "0.11.0+wasi-snapshot-preview1"
1507 | source = "registry+https://github.com/rust-lang/crates.io-index"
1508 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
1509 |
1510 | [[package]]
1511 | name = "wasm-bindgen"
1512 | version = "0.2.89"
1513 | source = "registry+https://github.com/rust-lang/crates.io-index"
1514 | checksum = "0ed0d4f68a3015cc185aff4db9506a015f4b96f95303897bfa23f846db54064e"
1515 | dependencies = [
1516 | "cfg-if",
1517 | "wasm-bindgen-macro",
1518 | ]
1519 |
1520 | [[package]]
1521 | name = "wasm-bindgen-backend"
1522 | version = "0.2.89"
1523 | source = "registry+https://github.com/rust-lang/crates.io-index"
1524 | checksum = "1b56f625e64f3a1084ded111c4d5f477df9f8c92df113852fa5a374dbda78826"
1525 | dependencies = [
1526 | "bumpalo",
1527 | "log",
1528 | "once_cell",
1529 | "proc-macro2",
1530 | "quote",
1531 | "syn 2.0.39",
1532 | "wasm-bindgen-shared",
1533 | ]
1534 |
1535 | [[package]]
1536 | name = "wasm-bindgen-macro"
1537 | version = "0.2.89"
1538 | source = "registry+https://github.com/rust-lang/crates.io-index"
1539 | checksum = "0162dbf37223cd2afce98f3d0785506dcb8d266223983e4b5b525859e6e182b2"
1540 | dependencies = [
1541 | "quote",
1542 | "wasm-bindgen-macro-support",
1543 | ]
1544 |
1545 | [[package]]
1546 | name = "wasm-bindgen-macro-support"
1547 | version = "0.2.89"
1548 | source = "registry+https://github.com/rust-lang/crates.io-index"
1549 | checksum = "f0eb82fcb7930ae6219a7ecfd55b217f5f0893484b7a13022ebb2b2bf20b5283"
1550 | dependencies = [
1551 | "proc-macro2",
1552 | "quote",
1553 | "syn 2.0.39",
1554 | "wasm-bindgen-backend",
1555 | "wasm-bindgen-shared",
1556 | ]
1557 |
1558 | [[package]]
1559 | name = "wasm-bindgen-shared"
1560 | version = "0.2.89"
1561 | source = "registry+https://github.com/rust-lang/crates.io-index"
1562 | checksum = "7ab9b36309365056cd639da3134bf87fa8f3d86008abf99e612384a6eecd459f"
1563 |
1564 | [[package]]
1565 | name = "winapi"
1566 | version = "0.3.9"
1567 | source = "registry+https://github.com/rust-lang/crates.io-index"
1568 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
1569 | dependencies = [
1570 | "winapi-i686-pc-windows-gnu",
1571 | "winapi-x86_64-pc-windows-gnu",
1572 | ]
1573 |
1574 | [[package]]
1575 | name = "winapi-i686-pc-windows-gnu"
1576 | version = "0.4.0"
1577 | source = "registry+https://github.com/rust-lang/crates.io-index"
1578 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
1579 |
1580 | [[package]]
1581 | name = "winapi-x86_64-pc-windows-gnu"
1582 | version = "0.4.0"
1583 | source = "registry+https://github.com/rust-lang/crates.io-index"
1584 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
1585 |
1586 | [[package]]
1587 | name = "windows-core"
1588 | version = "0.51.1"
1589 | source = "registry+https://github.com/rust-lang/crates.io-index"
1590 | checksum = "f1f8cf84f35d2db49a46868f947758c7a1138116f7fac3bc844f43ade1292e64"
1591 | dependencies = [
1592 | "windows-targets",
1593 | ]
1594 |
1595 | [[package]]
1596 | name = "windows-sys"
1597 | version = "0.48.0"
1598 | source = "registry+https://github.com/rust-lang/crates.io-index"
1599 | checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9"
1600 | dependencies = [
1601 | "windows-targets",
1602 | ]
1603 |
1604 | [[package]]
1605 | name = "windows-targets"
1606 | version = "0.48.5"
1607 | source = "registry+https://github.com/rust-lang/crates.io-index"
1608 | checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c"
1609 | dependencies = [
1610 | "windows_aarch64_gnullvm",
1611 | "windows_aarch64_msvc",
1612 | "windows_i686_gnu",
1613 | "windows_i686_msvc",
1614 | "windows_x86_64_gnu",
1615 | "windows_x86_64_gnullvm",
1616 | "windows_x86_64_msvc",
1617 | ]
1618 |
1619 | [[package]]
1620 | name = "windows_aarch64_gnullvm"
1621 | version = "0.48.5"
1622 | source = "registry+https://github.com/rust-lang/crates.io-index"
1623 | checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8"
1624 |
1625 | [[package]]
1626 | name = "windows_aarch64_msvc"
1627 | version = "0.48.5"
1628 | source = "registry+https://github.com/rust-lang/crates.io-index"
1629 | checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc"
1630 |
1631 | [[package]]
1632 | name = "windows_i686_gnu"
1633 | version = "0.48.5"
1634 | source = "registry+https://github.com/rust-lang/crates.io-index"
1635 | checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e"
1636 |
1637 | [[package]]
1638 | name = "windows_i686_msvc"
1639 | version = "0.48.5"
1640 | source = "registry+https://github.com/rust-lang/crates.io-index"
1641 | checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406"
1642 |
1643 | [[package]]
1644 | name = "windows_x86_64_gnu"
1645 | version = "0.48.5"
1646 | source = "registry+https://github.com/rust-lang/crates.io-index"
1647 | checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e"
1648 |
1649 | [[package]]
1650 | name = "windows_x86_64_gnullvm"
1651 | version = "0.48.5"
1652 | source = "registry+https://github.com/rust-lang/crates.io-index"
1653 | checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc"
1654 |
1655 | [[package]]
1656 | name = "windows_x86_64_msvc"
1657 | version = "0.48.5"
1658 | source = "registry+https://github.com/rust-lang/crates.io-index"
1659 | checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538"
1660 |
1661 | [[package]]
1662 | name = "winnow"
1663 | version = "0.5.19"
1664 | source = "registry+https://github.com/rust-lang/crates.io-index"
1665 | checksum = "829846f3e3db426d4cee4510841b71a8e58aa2a76b1132579487ae430ccd9c7b"
1666 | dependencies = [
1667 | "memchr",
1668 | ]
1669 |
--------------------------------------------------------------------------------
/Cargo.toml:
--------------------------------------------------------------------------------
1 | [package]
2 | name = "streamgen"
3 | version = "0.1.0"
4 | edition = "2021"
5 |
6 | authors = ["Arroyo Systems "]
7 | license = "MIT OR Apache-2.0"
8 | repository = "https://github.com/ArroyoSystems/streamgen"
9 | homepage = "https://arroyo.dev"
10 | description = """
11 | A tool for generating streams of data for testing and benchmarking.
12 | """
13 |
14 | categories = ["development-tools", "command-line-utilities"]
15 |
16 | keywords = ["streaming", "data", "generator", "fake", "kafka"]
17 |
18 | [features]
19 | kafka = ["rdkafka"]
20 |
21 | [dependencies]
22 | axum = "0.7.1"
23 | chrono = {version = "0.4", features = ["serde"]}
24 | clap = { version = "4.4.10", features = ["derive"] }
25 | fake = { version = "2.9.1", features = ["http", "derive"] }
26 | http = "1.0.0"
27 | rand = "0.8.5"
28 | tokio = { version = "1.34.0", features = ["full"] }
29 | tracing = "0.1.40"
30 | headers = "0.4.0"
31 | axum-extra = { version = "0.9.0", features = ["typed-header"] }
32 | tokio-stream = { version = "0.1.14", features = ["full"] }
33 | async-trait = "0.1.74"
34 | tracing-subscriber = { version = "0.3.18", features = ["default", "env-filter"] }
35 | serde = {version = "1", features = ["derive"]}
36 | serde_json = "1.0.108"
37 |
38 | rdkafka = { version = "0.36.0", features = ["cmake-build"], optional = true }
39 | uuid = { version = "1.6.1", features = ["v4"] }
--------------------------------------------------------------------------------
/LICENSE-APACHE:
--------------------------------------------------------------------------------
1 | Apache License
2 | Version 2.0, January 2004
3 | http://www.apache.org/licenses/
4 |
5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6 |
7 | 1. Definitions.
8 |
9 | "License" shall mean the terms and conditions for use, reproduction,
10 | and distribution as defined by Sections 1 through 9 of this document.
11 |
12 | "Licensor" shall mean the copyright owner or entity authorized by
13 | the copyright owner that is granting the License.
14 |
15 | "Legal Entity" shall mean the union of the acting entity and all
16 | other entities that control, are controlled by, or are under common
17 | control with that entity. For the purposes of this definition,
18 | "control" means (i) the power, direct or indirect, to cause the
19 | direction or management of such entity, whether by contract or
20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the
21 | outstanding shares, or (iii) beneficial ownership of such entity.
22 |
23 | "You" (or "Your") shall mean an individual or Legal Entity
24 | exercising permissions granted by this License.
25 |
26 | "Source" form shall mean the preferred form for making modifications,
27 | including but not limited to software source code, documentation
28 | source, and configuration files.
29 |
30 | "Object" form shall mean any form resulting from mechanical
31 | transformation or translation of a Source form, including but
32 | not limited to compiled object code, generated documentation,
33 | and conversions to other media types.
34 |
35 | "Work" shall mean the work of authorship, whether in Source or
36 | Object form, made available under the License, as indicated by a
37 | copyright notice that is included in or attached to the work
38 | (an example is provided in the Appendix below).
39 |
40 | "Derivative Works" shall mean any work, whether in Source or Object
41 | form, that is based on (or derived from) the Work and for which the
42 | editorial revisions, annotations, elaborations, or other modifications
43 | represent, as a whole, an original work of authorship. For the purposes
44 | of this License, Derivative Works shall not include works that remain
45 | separable from, or merely link (or bind by name) to the interfaces of,
46 | the Work and Derivative Works thereof.
47 |
48 | "Contribution" shall mean any work of authorship, including
49 | the original version of the Work and any modifications or additions
50 | to that Work or Derivative Works thereof, that is intentionally
51 | submitted to Licensor for inclusion in the Work by the copyright owner
52 | or by an individual or Legal Entity authorized to submit on behalf of
53 | the copyright owner. For the purposes of this definition, "submitted"
54 | means any form of electronic, verbal, or written communication sent
55 | to the Licensor or its representatives, including but not limited to
56 | communication on electronic mailing lists, source code control systems,
57 | and issue tracking systems that are managed by, or on behalf of, the
58 | Licensor for the purpose of discussing and improving the Work, but
59 | excluding communication that is conspicuously marked or otherwise
60 | designated in writing by the copyright owner as "Not a Contribution."
61 |
62 | "Contributor" shall mean Licensor and any individual or Legal Entity
63 | on behalf of whom a Contribution has been received by Licensor and
64 | subsequently incorporated within the Work.
65 |
66 | 2. Grant of Copyright License. Subject to the terms and conditions of
67 | this License, each Contributor hereby grants to You a perpetual,
68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
69 | copyright license to reproduce, prepare Derivative Works of,
70 | publicly display, publicly perform, sublicense, and distribute the
71 | Work and such Derivative Works in Source or Object form.
72 |
73 | 3. Grant of Patent License. Subject to the terms and conditions of
74 | this License, each Contributor hereby grants to You a perpetual,
75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
76 | (except as stated in this section) patent license to make, have made,
77 | use, offer to sell, sell, import, and otherwise transfer the Work,
78 | where such license applies only to those patent claims licensable
79 | by such Contributor that are necessarily infringed by their
80 | Contribution(s) alone or by combination of their Contribution(s)
81 | with the Work to which such Contribution(s) was submitted. If You
82 | institute patent litigation against any entity (including a
83 | cross-claim or counterclaim in a lawsuit) alleging that the Work
84 | or a Contribution incorporated within the Work constitutes direct
85 | or contributory patent infringement, then any patent licenses
86 | granted to You under this License for that Work shall terminate
87 | as of the date such litigation is filed.
88 |
89 | 4. Redistribution. You may reproduce and distribute copies of the
90 | Work or Derivative Works thereof in any medium, with or without
91 | modifications, and in Source or Object form, provided that You
92 | meet the following conditions:
93 |
94 | (a) You must give any other recipients of the Work or
95 | Derivative Works a copy of this License; and
96 |
97 | (b) You must cause any modified files to carry prominent notices
98 | stating that You changed the files; and
99 |
100 | (c) You must retain, in the Source form of any Derivative Works
101 | that You distribute, all copyright, patent, trademark, and
102 | attribution notices from the Source form of the Work,
103 | excluding those notices that do not pertain to any part of
104 | the Derivative Works; and
105 |
106 | (d) If the Work includes a "NOTICE" text file as part of its
107 | distribution, then any Derivative Works that You distribute must
108 | include a readable copy of the attribution notices contained
109 | within such NOTICE file, excluding those notices that do not
110 | pertain to any part of the Derivative Works, in at least one
111 | of the following places: within a NOTICE text file distributed
112 | as part of the Derivative Works; within the Source form or
113 | documentation, if provided along with the Derivative Works; or,
114 | within a display generated by the Derivative Works, if and
115 | wherever such third-party notices normally appear. The contents
116 | of the NOTICE file are for informational purposes only and
117 | do not modify the License. You may add Your own attribution
118 | notices within Derivative Works that You distribute, alongside
119 | or as an addendum to the NOTICE text from the Work, provided
120 | that such additional attribution notices cannot be construed
121 | as modifying the License.
122 |
123 | You may add Your own copyright statement to Your modifications and
124 | may provide additional or different license terms and conditions
125 | for use, reproduction, or distribution of Your modifications, or
126 | for any such Derivative Works as a whole, provided Your use,
127 | reproduction, and distribution of the Work otherwise complies with
128 | the conditions stated in this License.
129 |
130 | 5. Submission of Contributions. Unless You explicitly state otherwise,
131 | any Contribution intentionally submitted for inclusion in the Work
132 | by You to the Licensor shall be under the terms and conditions of
133 | this License, without any additional terms or conditions.
134 | Notwithstanding the above, nothing herein shall supersede or modify
135 | the terms of any separate license agreement you may have executed
136 | with Licensor regarding such Contributions.
137 |
138 | 6. Trademarks. This License does not grant permission to use the trade
139 | names, trademarks, service marks, or product names of the Licensor,
140 | except as required for reasonable and customary use in describing the
141 | origin of the Work and reproducing the content of the NOTICE file.
142 |
143 | 7. Disclaimer of Warranty. Unless required by applicable law or
144 | agreed to in writing, Licensor provides the Work (and each
145 | Contributor provides its Contributions) on an "AS IS" BASIS,
146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
147 | implied, including, without limitation, any warranties or conditions
148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
149 | PARTICULAR PURPOSE. You are solely responsible for determining the
150 | appropriateness of using or redistributing the Work and assume any
151 | risks associated with Your exercise of permissions under this License.
152 |
153 | 8. Limitation of Liability. In no event and under no legal theory,
154 | whether in tort (including negligence), contract, or otherwise,
155 | unless required by applicable law (such as deliberate and grossly
156 | negligent acts) or agreed to in writing, shall any Contributor be
157 | liable to You for damages, including any direct, indirect, special,
158 | incidental, or consequential damages of any character arising as a
159 | result of this License or out of the use or inability to use the
160 | Work (including but not limited to damages for loss of goodwill,
161 | work stoppage, computer failure or malfunction, or any and all
162 | other commercial damages or losses), even if such Contributor
163 | has been advised of the possibility of such damages.
164 |
165 | 9. Accepting Warranty or Additional Liability. While redistributing
166 | the Work or Derivative Works thereof, You may choose to offer,
167 | and charge a fee for, acceptance of support, warranty, indemnity,
168 | or other liability obligations and/or rights consistent with this
169 | License. However, in accepting such obligations, You may act only
170 | on Your own behalf and on Your sole responsibility, not on behalf
171 | of any other Contributor, and only if You agree to indemnify,
172 | defend, and hold each Contributor harmless for any liability
173 | incurred by, or claims asserted against, such Contributor by reason
174 | of your accepting any such warranty or additional liability.
175 |
176 | END OF TERMS AND CONDITIONS
177 |
178 | APPENDIX: How to apply the Apache License to your work.
179 |
180 | To apply the Apache License to your work, attach the following
181 | boilerplate notice, with the fields enclosed by brackets "[]"
182 | replaced with your own identifying information. (Don't include
183 | the brackets!) The text should be enclosed in the appropriate
184 | comment syntax for the file format. We also recommend that a
185 | file or class name and description of purpose be included on the
186 | same "printed page" as the copyright notice for easier
187 | identification within third-party archives.
188 |
189 | Copyright [yyyy] [name of copyright owner]
190 |
191 | Licensed under the Apache License, Version 2.0 (the "License");
192 | you may not use this file except in compliance with the License.
193 | You may obtain a copy of the License at
194 |
195 | http://www.apache.org/licenses/LICENSE-2.0
196 |
197 | Unless required by applicable law or agreed to in writing, software
198 | distributed under the License is distributed on an "AS IS" BASIS,
199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
200 | See the License for the specific language governing permissions and
201 | limitations under the License.
202 |
--------------------------------------------------------------------------------
/LICENSE-MIT:
--------------------------------------------------------------------------------
1 | Copyright (c) 2014 The Rust Project Developers
2 |
3 | Permission is hereby granted, free of charge, to any
4 | person obtaining a copy of this software and associated
5 | documentation files (the "Software"), to deal in the
6 | Software without restriction, including without
7 | limitation the rights to use, copy, modify, merge,
8 | publish, distribute, sublicense, and/or sell copies of
9 | the Software, and to permit persons to whom the Software
10 | is furnished to do so, subject to the following
11 | conditions:
12 |
13 | The above copyright notice and this permission notice
14 | shall be included in all copies or substantial portions
15 | of the Software.
16 |
17 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
18 | ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
19 | TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
20 | PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
21 | SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
22 | CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
23 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
24 | IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
25 | DEALINGS IN THE SOFTWARE.
26 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Streamgen
2 |
3 | Streamgen is a CLI tool for generating streams of data for testing stream processing applications with
4 | engines like [Arroyo](https://github.com/ArroyoSystems/arroyo) or [Apache Flink](https://flink.apache.org/).
5 |
6 | [![Crates.io][crates-badge]][crates-url]
7 | [![MIT licensed][mit-badge]][mit-url]
8 | [![Build Status][actions-badge]][actions-url]
9 |
10 | [crates-badge]: https://img.shields.io/crates/v/streamgen.svg
11 | [crates-url]: https://crates.io/crates/streamgen
12 | [mit-badge]: https://img.shields.io/badge/license-MIT-blue.svg
13 | [mit-url]: https://github.com/ArroyoSystems/streamgen/blob/master/LICENSE-MIT
14 | [actions-badge]: https://github.com/ArroyoSystems/streamgen/actions/workflows/ci.yml/badge.svg
15 | [actions-url]: https://github.com/ArroyoSystems/streamgen/actions?query=branch%3Amain
16 |
17 |
18 | ## Features
19 |
20 | ### Sinks
21 |
22 | Streamgen can expose generated data via the following sinks:
23 |
24 | * `stdout` - Write data to stdout
25 | * `sse` - Run a [Server-Sent Events](https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events) server
26 | * `kafka` - Write data to a Kafka topic
27 |
28 | ### Formats
29 |
30 | * `string`
31 | * `json`
32 |
33 | ### Generators
34 |
35 | * `common-log` - [Common Log Format](https://en.wikipedia.org/wiki/Common_Log_Format) records
36 | * `impulse` - Stream of incrementing integers
37 | * `order` - Simulated web order events
38 | * `stock-trade` - Simulated stock trades
39 |
40 | ## Usage
41 |
42 | ```
43 | $ streamgen --help
44 |
45 | A tool for generating streams of data for testing and benchmarking.
46 |
47 |
48 | Usage: streamgen [OPTIONS] [COMMAND]
49 |
50 | Commands:
51 | stdout Write outputs to stdout
52 | sse Run a Server-Sent Events server
53 | kafka Write outputs to Kafka
54 | help Print this message or the help of the given subcommand(s)
55 |
56 | Arguments:
57 | Type of data to generator [possible values: common-log, impulse, order, stock-trade]
58 |
59 | Options:
60 | -f, --format Format of the generated data [possible values: string, json]
61 | -r, --rate Rate of generation in records per second
62 | -l, --limit Max number of records to generate
63 | -h, --help Print help
64 | -V, --version Print version
65 | ```
66 |
67 | Writing to stdout:
68 | ```
69 | $ streamgen --rate 10 --format string common-log stdout
70 | 66.70.249.106 - travis_quo [01/Dec/2023:14:52:26 -0800] "GET /company.doc" 405 4521 "-" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36"
71 | 43.89.162.120 - vesta_itaque [01/Dec/2023:14:52:26 -0800] "GET /tmp/first/same.doc" 400 4767 "-" "Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_2_1 like Mac OS X; nb-no) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148a Safari/6533.18.5"
72 | 206.157.23.40 - lulu_molestias [01/Dec/2023:14:52:27 -0800] "GET /sbin/charlotte.rar" 401 1519 "-" "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727)"
73 | 63.37.55.188 - roscoe_nemo [01/Dec/2023:14:52:27 -0800] "POST /var/problem/government.xls" 400 7044 "-" "Mozilla/5.0 (iPad; CPU OS 5_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko ) Version/5.1 Mobile/9B176 Safari/7534.48.3"
74 | 129.215.157.150 - angie_dolorum [01/Dec/2023:14:52:27 -0800] "GET /usr.txt" 405 2768 "-" "Mozilla/5.0 (iPad; CPU OS 5_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko ) Version/5.1 Mobile/9B176 Safari/7534.48.3"
75 | 213.73.92.8 - roscoe_omnis [01/Dec/2023:14:52:27 -0800] "GET /etc/case/life.ppt" 404 4371 "-" "Opera/9.80 (Windows NT 6.0) Presto/2.12.388 Version/12.14"
76 | ```
77 |
78 | Writing to Kafka
79 | ```sh
80 | $ streamgen --format json order kafka --topic orders --bootstrap-servers localhost:9092
81 | ```
82 |
83 | ## Installation
84 |
85 | ### From binaries
86 |
87 | Pre-built binaries are available for Linux and macOS on the
88 | [releases page](https://github.com/ArroyoSystems/streamgen/releases).
89 |
90 | ### From source
91 |
92 | Streamgen can be built from source via Cargo:
93 |
94 | ```
95 | $ cargo install streamgen
96 | ```
97 |
98 | If you would like Kafka support, you will need to pass the `--features kafka` flag to Cargo:
99 |
100 | ```
101 | $ cargo install streamgen --features kafka
102 | ```
103 |
104 | This relies on the rust-rdkafka library; to use this you will need to have the necessary dependencies installed
105 | on your system. See the [rust-rdkafka README](https://github.com/fede1024/rust-rdkafka#installation) for more details.
106 |
--------------------------------------------------------------------------------
/resources/symbols.txt:
--------------------------------------------------------------------------------
1 | AA
2 | AAC
3 | AAN
4 | AAP
5 | AAT
6 | AAV
7 | AB
8 | ABB
9 | ABBV
10 | ABC
11 | ABEV
12 | ABG
13 | ABM
14 | ABR
15 | ABRN
16 | ABT
17 | ABX
18 | ACC
19 | ACCO
20 | ACE
21 | ACG
22 | ACH
23 | ACI
24 | ACM
25 | ACMP
26 | ACN
27 | ACP
28 | ACRE
29 | ACT
30 | ACW
31 | ADC
32 | ADM
33 | ADPT
34 | ADS
35 | ADT
36 | ADX
37 | AEB
38 | AEC
39 | AED
40 | AEE
41 | AEG
42 | AEH
43 | AEK
44 | AEL
45 | AEM
46 | AEO
47 | AEP
48 | AER
49 | AES
50 | AET
51 | AF
52 | AFA
53 | AFB
54 | AFC
55 | AFG
56 | AFGE
57 | AFL
58 | AFM
59 | AFQ
60 | AFSD
61 | AFT
62 | AFW
63 | AG
64 | AGC
65 | AGCO
66 | AGD
67 | AGI
68 | AGM
69 | AGN
70 | AGO
71 | AGRO
72 | AGU
73 | AGX
74 | AHC
75 | AHH
76 | AHL
77 | AHP
78 | AHS
79 | AHT
80 | AI
81 | AIB
82 | AIF
83 | AIG
84 | AIN
85 | AIR
86 | AIT
87 | AIV
88 | AIW
89 | AIY
90 | AIZ
91 | AJG
92 | AKP
93 | AKR
94 | AKS
95 | AL
96 | ALB
97 | ALDW
98 | ALE
99 | ALEX
100 | ALG
101 | ALJ
102 | ALK
103 | ALL
104 | ALLE
105 | ALLY
106 | ALR
107 | ALSN
108 | ALU
109 | ALV
110 | ALX
111 | AM
112 | AMBR
113 | AMC
114 | AME
115 | AMFW
116 | AMG
117 | AMH
118 | AMID
119 | AMP
120 | AMRC
121 | AMRE
122 | AMT
123 | AMTD
124 | AMTG
125 | AMX
126 | AN
127 | ANET
128 | ANF
129 | ANFI
130 | ANH
131 | ANN
132 | ANR
133 | ANTM
134 | ANW
135 | AOD
136 | AOI
137 | AOL
138 | AON
139 | AOS
140 | AP
141 | APA
142 | APAM
143 | APB
144 | APC
145 | APD
146 | APF
147 | APH
148 | APL
149 | APO
150 | APU
151 | AR
152 | ARC
153 | ARCO
154 | ARCX
155 | ARDC
156 | ARE
157 | ARES
158 | ARG
159 | ARI
160 | ARL
161 | ARMF
162 | ARMK
163 | ARN
164 | ARO
165 | ARP
166 | ARPI
167 | ARR
168 | ARU
169 | ARW
170 | ARY
171 | ASA
172 | ASB
173 | ASC
174 | ASG
175 | ASGN
176 | ASH
177 | ASPN
178 | ASR
179 | ASX
180 | AT
181 | ATE
182 | ATEN
183 | ATHM
184 | ATI
185 | ATK
186 | ATLS
187 | ATO
188 | ATR
189 | ATTO
190 | ATU
191 | ATV
192 | ATW
193 | AU
194 | AUO
195 | AUQ
196 | AUY
197 | AV
198 | AVA
199 | AVAL
200 | AVB
201 | AVD
202 | AVG
203 | AVH
204 | AVIV
205 | AVK
206 | AVOL
207 | AVP
208 | AVT
209 | AVV
210 | AVX
211 | AVY
212 | AWF
213 | AWH
214 | AWI
215 | AWK
216 | AWP
217 | AWR
218 | AXE
219 | AXL
220 | AXLL
221 | AXP
222 | AXR
223 | AXS
224 | AXTA
225 | AYI
226 | AYN
227 | AYR
228 | AZN
229 | AZO
230 | AZZ
231 | B
232 | BA
233 | BABA
234 | BAC
235 | BAF
236 | BAH
237 | BAK
238 | BALT
239 | BAM
240 | BANC
241 | BAP
242 | BAS
243 | BAX
244 | BBD
245 | BBDO
246 | BBF
247 | BBG
248 | BBK
249 | BBL
250 | BBN
251 | BBT
252 | BBVA
253 | BBW
254 | BBX
255 | BBY
256 | BC
257 | BCA
258 | BCC
259 | BCE
260 | BCEI
261 | BCH
262 | BCO
263 | BCR
264 | BCRH
265 | BCS
266 | BCX
267 | BDC
268 | BDJ
269 | BDN
270 | BDX
271 | BEE
272 | BEL
273 | BEN
274 | BEP
275 | BERY
276 | BFAM
277 | BFK
278 | BFO
279 | BFR
280 | BFS
281 | BFZ
282 | BG
283 | BGB
284 | BGC
285 | BGCA
286 | BGG
287 | BGH
288 | BGR
289 | BGS
290 | BGT
291 | BGX
292 | BGY
293 | BH
294 | BHE
295 | BHI
296 | BHK
297 | BHL
298 | BHLB
299 | BHP
300 | BID
301 | BIE
302 | BIF
303 | BIG
304 | BIN
305 | BIO
306 | BIOA
307 | BIP
308 | BIT
309 | BITA
310 | BJZ
311 | BK
312 | BKD
313 | BKE
314 | BKH
315 | BKK
316 | BKN
317 | BKS
318 | BKT
319 | BKU
320 | BLH
321 | BLK
322 | BLL
323 | BLOX
324 | BLT
325 | BLW
326 | BLX
327 | BMA
328 | BME
329 | BMI
330 | BMO
331 | BMR
332 | BMS
333 | BMY
334 | BNJ
335 | BNK
336 | BNS
337 | BNY
338 | BOCA
339 | BOE
340 | BOH
341 | BOI
342 | BOOT
343 | BORN
344 | BOXC
345 | BP
346 | BPI
347 | BPK
348 | BPL
349 | BPT
350 | BPY
351 | BPZ
352 | BQH
353 | BR
354 | BRC
355 | BRFS
356 | BRO
357 | BRP
358 | BRS
359 | BRSS
360 | BRT
361 | BRX
362 | BSAC
363 | BSBR
364 | BSD
365 | BSE
366 | BSI
367 | BSL
368 | BSMX
369 | BST
370 | BSX
371 | BT
372 | BTA
373 | BTE
374 | BTF
375 | BTH
376 | BTO
377 | BTT
378 | BTU
379 | BTZ
380 | BUD
381 | BUI
382 | BURL
383 | BVN
384 | BWA
385 | BWC
386 | BWG
387 | BWP
388 | BWS
389 | BX
390 | BXC
391 | BXE
392 | BXMT
393 | BXMX
394 | BXP
395 | BXS
396 | BYD
397 | BYM
398 | BZH
399 | BZT
400 | C
401 | CAB
402 | CACI
403 | CAE
404 | CAF
405 | CAG
406 | CAH
407 | CAJ
408 | CALX
409 | CAM
410 | CAP
411 | CAPL
412 | CAS
413 | CAT
414 | CATO
415 | CB
416 | CBA
417 | CBB
418 | CBD
419 | CBG
420 | CBI
421 | CBK
422 | CBL
423 | CBM
424 | CBPX
425 | CBR
426 | CBS
427 | CBT
428 | CBU
429 | CBZ
430 | CCC
431 | CCE
432 | CCG
433 | CCI
434 | CCJ
435 | CCK
436 | CCL
437 | CCM
438 | CCO
439 | CCS
440 | CCSC
441 | CCU
442 | CCV
443 | CCZ
444 | CDE
445 | CDI
446 | CDR
447 | CE
448 | CEA
449 | CEB
450 | CEE
451 | CEL
452 | CELP
453 | CEM
454 | CEN
455 | CEO
456 | CEQP
457 | CF
458 | CFG
459 | CFI
460 | CFN
461 | CFR
462 | CFX
463 | CGA
464 | CGG
465 | CGI
466 | CHA
467 | CHD
468 | CHE
469 | CHGG
470 | CHH
471 | CHK
472 | CHKR
473 | CHL
474 | CHMI
475 | CHMT
476 | CHN
477 | CHS
478 | CHSP
479 | CHT
480 | CHU
481 | CI
482 | CIA
483 | CIB
484 | CIE
485 | CIEN
486 | CIF
487 | CIG
488 | CII
489 | CIM
490 | CIO
491 | CIR
492 | CIT
493 | CIVI
494 | CJES
495 | CKH
496 | CKP
497 | CL
498 | CLA
499 | CLB
500 | CLC
501 | CLD
502 | CLDT
503 | CLF
504 | CLGX
505 | CLH
506 | CLI
507 | CLNY
508 | CLR
509 | CLS
510 | CLV
511 | CLW
512 | CLX
513 | CM
514 | CMA
515 | CMC
516 | CMCM
517 | CMG
518 | CMI
519 | CMK
520 | CMLP
521 | CMN
522 | CMO
523 | CMP
524 | CMRE
525 | CMS
526 | CMU
527 | CNA
528 | CNC
529 | CNCO
530 | CNHI
531 | CNI
532 | CNK
533 | CNL
534 | CNNX
535 | CNO
536 | CNP
537 | CNQ
538 | CNS
539 | CNW
540 | CNX
541 | CO
542 | CODE
543 | CODI
544 | COF
545 | COG
546 | COH
547 | COL
548 | COO
549 | COP
550 | COR
551 | CORR
552 | COT
553 | COTY
554 | COUP
555 | COV
556 | CP
557 | CPA
558 | CPAC
559 | CPB
560 | CPE
561 | CPF
562 | CPG
563 | CPK
564 | CPL
565 | CPN
566 | CPS
567 | CPT
568 | CR
569 | CRC
570 | CRCM
571 | CRH
572 | CRI
573 | CRK
574 | CRL
575 | CRM
576 | CRR
577 | CRS
578 | CRT
579 | CRY
580 | CS
581 | CSC
582 | CSG
583 | CSH
584 | CSI
585 | CSL
586 | CSLT
587 | CSS
588 | CST
589 | CSTM
590 | CSU
591 | CSV
592 | CSX
593 | CTB
594 | CTL
595 | CTLT
596 | CTQ
597 | CTR
598 | CTS
599 | CTT
600 | CTU
601 | CTV
602 | CTW
603 | CTX
604 | CTY
605 | CUB
606 | CUBE
607 | CUBI
608 | CUBS
609 | CUDA
610 | CUK
611 | CUZ
612 | CVA
613 | CVB
614 | CVC
615 | CVD
616 | CVE
617 | CVEO
618 | CVG
619 | CVI
620 | CVO
621 | CVRR
622 | CVS
623 | CVT
624 | CVX
625 | CW
626 | CWEI
627 | CWT
628 | CX
629 | CXE
630 | CXH
631 | CXO
632 | CXP
633 | CXW
634 | CYD
635 | CYH
636 | CYN
637 | CYNI
638 | CYS
639 | CYT
640 | CZZ
641 | D
642 | DAC
643 | DAL
644 | DAN
645 | DANG
646 | DAR
647 | DATA
648 | DB
649 | DBD
650 | DBL
651 | DCA
652 | DCI
653 | DCM
654 | DCO
655 | DCT
656 | DCUA
657 | DCUB
658 | DCUC
659 | DD
660 | DDC
661 | DDD
662 | DDE
663 | DDF
664 | DDR
665 | DDS
666 | DDT
667 | DE
668 | DECK
669 | DEG
670 | DEI
671 | DEL
672 | DEO
673 | DEX
674 | DF
675 | DFP
676 | DFS
677 | DFT
678 | DG
679 | DGI
680 | DGX
681 | DHF
682 | DHG
683 | DHI
684 | DHR
685 | DHT
686 | DHX
687 | DIAX
688 | DIN
689 | DIS
690 | DK
691 | DKL
692 | DKS
693 | DKT
694 | DL
695 | DLB
696 | DLNG
697 | DLPH
698 | DLR
699 | DLX
700 | DM
701 | DMB
702 | DMD
703 | DMO
704 | DNB
705 | DNI
706 | DNOW
707 | DNP
708 | DNR
709 | DNY
710 | DO
711 | DOC
712 | DOM
713 | DOOR
714 | DOV
715 | DOW
716 | DPG
717 | DPLO
718 | DPM
719 | DPS
720 | DPZ
721 | DQ
722 | DRA
723 | DRC
724 | DRD
725 | DRE
726 | DRH
727 | DRI
728 | DRII
729 | DRL
730 | DRQ
731 | DSE
732 | DSL
733 | DSM
734 | DST
735 | DSU
736 | DSW
737 | DSX
738 | DTE
739 | DTF
740 | DTK
741 | DTQ
742 | DTT
743 | DTZ
744 | DUA
745 | DUC
746 | DUK
747 | DUKH
748 | DV
749 | DVA
750 | DVD
751 | DVN
752 | DW
753 | DWRE
754 | DX
755 | DXB
756 | DY
757 | DYN
758 | E
759 | EAA
760 | EAB
761 | EAE
762 | EARN
763 | EAT
764 | EBF
765 | EBR
766 | EBS
767 | EC
768 | ECA
769 | ECC
770 | ECL
771 | ECOM
772 | ECR
773 | ECT
774 | ED
775 | EDD
776 | EDE
777 | EDF
778 | EDI
779 | EDN
780 | EDR
781 | EDU
782 | EE
783 | EEA
784 | EEP
785 | EEQ
786 | EFC
787 | EFF
788 | EFM
789 | EFR
790 | EFT
791 | EFX
792 | EGF
793 | EGL
794 | EGN
795 | EGO
796 | EGP
797 | EGY
798 | EHI
799 | EHIC
800 | EIG
801 | EIX
802 | EJ
803 | EL
804 | ELA
805 | ELB
806 | ELJ
807 | ELLI
808 | ELP
809 | ELS
810 | ELU
811 | ELX
812 | ELY
813 | EMC
814 | EMD
815 | EME
816 | EMES
817 | EMF
818 | EMN
819 | EMO
820 | EMQ
821 | EMR
822 | EMZ
823 | ENB
824 | ENBL
825 | ENH
826 | ENI
827 | ENJ
828 | ENL
829 | ENLC
830 | ENLK
831 | ENR
832 | ENS
833 | ENV
834 | ENVA
835 | ENZ
836 | EOC
837 | EOD
838 | EOG
839 | EOI
840 | EOS
841 | EOT
842 | EPAM
843 | EPD
844 | EPE
845 | EPR
846 | EQC
847 | EQCO
848 | EQM
849 | EQR
850 | EQS
851 | EQT
852 | EQY
853 | ERA
854 | ERF
855 | ERJ
856 | EROS
857 | ESD
858 | ESE
859 | ESI
860 | ESL
861 | ESNT
862 | ESRT
863 | ESS
864 | ESV
865 | ETB
866 | ETE
867 | ETG
868 | ETH
869 | ETJ
870 | ETM
871 | ETN
872 | ETO
873 | ETP
874 | ETR
875 | ETV
876 | ETW
877 | ETX
878 | ETY
879 | EV
880 | EVC
881 | EVDY
882 | EVER
883 | EVF
884 | EVG
885 | EVGN
886 | EVHC
887 | EVN
888 | EVR
889 | EVT
890 | EVTC
891 | EW
892 | EXAM
893 | EXAR
894 | EXC
895 | EXCU
896 | EXD
897 | EXG
898 | EXH
899 | EXK
900 | EXL
901 | EXP
902 | EXPR
903 | EXR
904 | EZT
905 | F
906 | FAC
907 | FAF
908 | FAM
909 | FAV
910 | FBC
911 | FBHS
912 | FBP
913 | FBR
914 | FC
915 | FCAM
916 | FCAU
917 | FCB
918 | FCF
919 | FCH
920 | FCN
921 | FCT
922 | FCX
923 | FDI
924 | FDO
925 | FDP
926 | FDS
927 | FDX
928 | FE
929 | FEI
930 | FELP
931 | FENG
932 | FEO
933 | FET
934 | FF
935 | FFA
936 | FFC
937 | FFG
938 | FGB
939 | FGL
940 | FGP
941 | FHN
942 | FHY
943 | FI
944 | FICO
945 | FIF
946 | FIG
947 | FII
948 | FIS
949 | FIX
950 | FL
951 | FLC
952 | FLO
953 | FLR
954 | FLS
955 | FLT
956 | FLTX
957 | FLY
958 | FMC
959 | FMD
960 | FMN
961 | FMO
962 | FMS
963 | FMSA
964 | FMX
965 | FMY
966 | FN
967 | FNB
968 | FNF
969 | FNFV
970 | FNV
971 | FOE
972 | FOF
973 | FOR
974 | FPF
975 | FPL
976 | FPO
977 | FPT
978 | FR
979 | FRA
980 | FRC
981 | FRM
982 | FRO
983 | FRT
984 | FSCE
985 | FSD
986 | FSIC
987 | FSL
988 | FSM
989 | FSS
990 | FT
991 | FTI
992 | FTK
993 | FTT
994 | FUL
995 | FUN
996 | FUR
997 | FVE
998 | FXCM
999 | G
1000 | GAB
1001 | GAM
1002 | GAS
1003 | GB
1004 | GBAB
1005 | GBL
1006 | GBX
1007 | GCA
1008 | GCAP
1009 | GCH
1010 | GCI
1011 | GCO
1012 | GCV
1013 | GD
1014 | GDF
1015 | GDL
1016 | GDO
1017 | GDOT
1018 | GDP
1019 | GDV
1020 | GE
1021 | GEB
1022 | GEF
1023 | GEH
1024 | GEK
1025 | GEL
1026 | GEO
1027 | GEQ
1028 | GER
1029 | GES
1030 | GF
1031 | GFA
1032 | GFF
1033 | GFI
1034 | GFIG
1035 | GFY
1036 | GG
1037 | GGB
1038 | GGE
1039 | GGG
1040 | GGM
1041 | GGP
1042 | GGT
1043 | GGZ
1044 | GHC
1045 | GHI
1046 | GHL
1047 | GHM
1048 | GHY
1049 | GIB
1050 | GIL
1051 | GIM
1052 | GIMO
1053 | GIS
1054 | GJH
1055 | GJO
1056 | GJP
1057 | GJR
1058 | GJS
1059 | GJT
1060 | GJV
1061 | GLF
1062 | GLOB
1063 | GLOG
1064 | GLOP
1065 | GLP
1066 | GLPW
1067 | GLT
1068 | GLW
1069 | GM
1070 | GME
1071 | GMED
1072 | GMK
1073 | GMT
1074 | GMZ
1075 | GNC
1076 | GNE
1077 | GNI
1078 | GNRC
1079 | GNT
1080 | GNW
1081 | GOF
1082 | GOL
1083 | GOV
1084 | GPC
1085 | GPI
1086 | GPK
1087 | GPM
1088 | GPN
1089 | GPRK
1090 | GPS
1091 | GPT
1092 | GPX
1093 | GRA
1094 | GRAM
1095 | GRO
1096 | GRR
1097 | GRT
1098 | GRUB
1099 | GRX
1100 | GS
1101 | GSF
1102 | GSH
1103 | GSI
1104 | GSJ
1105 | GSK
1106 | GSL
1107 | GTI
1108 | GTN
1109 | GTS
1110 | GTT
1111 | GTY
1112 | GUA
1113 | GUT
1114 | GVA
1115 | GWB
1116 | GWR
1117 | GWRE
1118 | GWRU
1119 | GWW
1120 | GXP
1121 | GY
1122 | GYB
1123 | GYC
1124 | GZT
1125 | H
1126 | HAE
1127 | HAL
1128 | HAR
1129 | HASI
1130 | HBI
1131 | HBM
1132 | HCA
1133 | HCC
1134 | HCI
1135 | HCJ
1136 | HCLP
1137 | HCN
1138 | HCP
1139 | HD
1140 | HDB
1141 | HDY
1142 | HE
1143 | HEI
1144 | HELI
1145 | HEP
1146 | HEQ
1147 | HES
1148 | HF
1149 | HFC
1150 | HGG
1151 | HGH
1152 | HGR
1153 | HGT
1154 | HHC
1155 | HHS
1156 | HHY
1157 | HI
1158 | HIE
1159 | HIG
1160 | HII
1161 | HIL
1162 | HIO
1163 | HIVE
1164 | HIW
1165 | HIX
1166 | HJV
1167 | HK
1168 | HL
1169 | HLF
1170 | HLS
1171 | HLT
1172 | HLX
1173 | HMC
1174 | HME
1175 | HMLP
1176 | HMN
1177 | HMY
1178 | HNI
1179 | HNP
1180 | HNR
1181 | HNT
1182 | HOG
1183 | HON
1184 | HOS
1185 | HOT
1186 | HOV
1187 | HP
1188 | HPF
1189 | HPI
1190 | HPP
1191 | HPQ
1192 | HPS
1193 | HPT
1194 | HPY
1195 | HQH
1196 | HQL
1197 | HR
1198 | HRB
1199 | HRC
1200 | HRG
1201 | HRL
1202 | HRS
1203 | HRTG
1204 | HSBC
1205 | HSC
1206 | HSEA
1207 | HSEB
1208 | HSP
1209 | HST
1210 | HSY
1211 | HT
1212 | HTA
1213 | HTD
1214 | HTF
1215 | HTGC
1216 | HTGX
1217 | HTGY
1218 | HTGZ
1219 | HTH
1220 | HTR
1221 | HTS
1222 | HTY
1223 | HTZ
1224 | HUBS
1225 | HUM
1226 | HUN
1227 | HVB
1228 | HVT
1229 | HW
1230 | HXL
1231 | HY
1232 | HYB
1233 | HYF
1234 | HYH
1235 | HYI
1236 | HYT
1237 | HZO
1238 | I
1239 | IAE
1240 | IAG
1241 | IBA
1242 | IBM
1243 | IBN
1244 | IBP
1245 | ICA
1246 | ICB
1247 | ICD
1248 | ICE
1249 | ICL
1250 | IDA
1251 | IDE
1252 | IDG
1253 | IDT
1254 | IEH
1255 | IEX
1256 | IFF
1257 | IFN
1258 | IFT
1259 | IGA
1260 | IGD
1261 | IGI
1262 | IGR
1263 | IGT
1264 | IHC
1265 | IHD
1266 | IHG
1267 | IHS
1268 | IID
1269 | IIF
1270 | IIM
1271 | IL
1272 | IM
1273 | IMAX
1274 | IMN
1275 | IMPR
1276 | IMPV
1277 | IMS
1278 | INB
1279 | IND
1280 | INF
1281 | INFY
1282 | ING
1283 | INGR
1284 | INN
1285 | INT
1286 | INVN
1287 | INXN
1288 | INZ
1289 | IO
1290 | IOC
1291 | IP
1292 | IPG
1293 | IPHI
1294 | IPI
1295 | IQI
1296 | IR
1297 | IRC
1298 | IRE
1299 | IRET
1300 | IRF
1301 | IRL
1302 | IRM
1303 | IRR
1304 | IRS
1305 | ISD
1306 | ISF
1307 | ISG
1308 | ISH
1309 | ISP
1310 | IT
1311 | ITC
1312 | ITG
1313 | ITT
1314 | ITUB
1315 | ITW
1316 | IVC
1317 | IVH
1318 | IVR
1319 | IVZ
1320 | IX
1321 | JAH
1322 | JBK
1323 | JBL
1324 | JBN
1325 | JBR
1326 | JBT
1327 | JCE
1328 | JCI
1329 | JCP
1330 | JDD
1331 | JE
1332 | JEC
1333 | JEQ
1334 | JFC
1335 | JFR
1336 | JGH
1337 | JGV
1338 | JGW
1339 | JHI
1340 | JHP
1341 | JHS
1342 | JHX
1343 | JKS
1344 | JLL
1345 | JLS
1346 | JMEI
1347 | JMF
1348 | JMI
1349 | JMLP
1350 | JMM
1351 | JMP
1352 | JMPB
1353 | JMPC
1354 | JMT
1355 | JNJ
1356 | JNPR
1357 | JNS
1358 | JOE
1359 | JOF
1360 | JONE
1361 | JOY
1362 | JPC
1363 | JPEP
1364 | JPI
1365 | JPM
1366 | JPS
1367 | JPW
1368 | JQC
1369 | JRI
1370 | JRN
1371 | JRO
1372 | JSD
1373 | JTA
1374 | JTD
1375 | JTP
1376 | JWN
1377 | K
1378 | KAI
1379 | KAMN
1380 | KAP
1381 | KAR
1382 | KATE
1383 | KB
1384 | KBH
1385 | KBR
1386 | KCC
1387 | KCG
1388 | KED
1389 | KEF
1390 | KEG
1391 | KEM
1392 | KEP
1393 | KEX
1394 | KEY
1395 | KEYS
1396 | KF
1397 | KFH
1398 | KFI
1399 | KFS
1400 | KFY
1401 | KGC
1402 | KHI
1403 | KIM
1404 | KING
1405 | KIO
1406 | KKD
1407 | KKR
1408 | KMB
1409 | KMF
1410 | KMG
1411 | KMI
1412 | KMM
1413 | KMPA
1414 | KMPR
1415 | KMT
1416 | KMX
1417 | KN
1418 | KND
1419 | KNL
1420 | KNM
1421 | KNOP
1422 | KNX
1423 | KO
1424 | KODK
1425 | KOF
1426 | KOP
1427 | KORS
1428 | KOS
1429 | KR
1430 | KRA
1431 | KRC
1432 | KRG
1433 | KRO
1434 | KS
1435 | KSM
1436 | KSS
1437 | KST
1438 | KSU
1439 | KT
1440 | KTF
1441 | KTH
1442 | KTN
1443 | KTP
1444 | KW
1445 | KWN
1446 | KWR
1447 | KYE
1448 | KYN
1449 | KYO
1450 | L
1451 | LAD
1452 | LADR
1453 | LAS
1454 | LAZ
1455 | LB
1456 | LBF
1457 | LC
1458 | LCI
1459 | LCM
1460 | LDF
1461 | LDL
1462 | LDOS
1463 | LDP
1464 | LDR
1465 | LEA
1466 | LEAF
1467 | LEE
1468 | LEG
1469 | LEJU
1470 | LEN
1471 | LEO
1472 | LEU
1473 | LF
1474 | LFC
1475 | LFL
1476 | LG
1477 | LGF
1478 | LGI
1479 | LH
1480 | LHO
1481 | LII
1482 | LITB
1483 | LL
1484 | LLL
1485 | LLY
1486 | LM
1487 | LMT
1488 | LNC
1489 | LND
1490 | LNKD
1491 | LNN
1492 | LNT
1493 | LO
1494 | LOCK
1495 | LOR
1496 | LOW
1497 | LPG
1498 | LPI
1499 | LPL
1500 | LPT
1501 | LPX
1502 | LQ
1503 | LRE
1504 | LRN
1505 | LTC
1506 | LTM
1507 | LUB
1508 | LUK
1509 | LUV
1510 | LUX
1511 | LVLT
1512 | LVS
1513 | LXFR
1514 | LXFT
1515 | LXK
1516 | LXP
1517 | LXU
1518 | LYB
1519 | LYG
1520 | LYV
1521 | LZB
1522 | M
1523 | MA
1524 | MAA
1525 | MAC
1526 | MAIN
1527 | MAN
1528 | MANU
1529 | MAS
1530 | MATX
1531 | MAV
1532 | MBI
1533 | MBLY
1534 | MBT
1535 | MC
1536 | MCA
1537 | MCC
1538 | MCD
1539 | MCI
1540 | MCK
1541 | MCN
1542 | MCO
1543 | MCP
1544 | MCQ
1545 | MCR
1546 | MCS
1547 | MCV
1548 | MCY
1549 | MD
1550 | MDC
1551 | MDLY
1552 | MDP
1553 | MDR
1554 | MDT
1555 | MDU
1556 | MED
1557 | MEG
1558 | MEI
1559 | MEN
1560 | MEP
1561 | MET
1562 | MFA
1563 | MFC
1564 | MFD
1565 | MFG
1566 | MFL
1567 | MFM
1568 | MFO
1569 | MFT
1570 | MFV
1571 | MG
1572 | MGA
1573 | MGF
1574 | MGM
1575 | MGR
1576 | MGU
1577 | MHD
1578 | MHF
1579 | MHFI
1580 | MHG
1581 | MHI
1582 | MHK
1583 | MHN
1584 | MHNA
1585 | MHNB
1586 | MHNC
1587 | MHO
1588 | MHR
1589 | MHY
1590 | MIC
1591 | MIE
1592 | MIG
1593 | MIL
1594 | MILL
1595 | MIN
1596 | MITT
1597 | MIXT
1598 | MIY
1599 | MJI
1600 | MJN
1601 | MKC
1602 | MKL
1603 | MLI
1604 | MLM
1605 | MLP
1606 | MLR
1607 | MM
1608 | MMC
1609 | MMD
1610 | MMI
1611 | MMM
1612 | MMP
1613 | MMS
1614 | MMT
1615 | MMU
1616 | MN
1617 | MNE
1618 | MNI
1619 | MNK
1620 | MNP
1621 | MNR
1622 | MO
1623 | MOD
1624 | MODN
1625 | MOH
1626 | MON
1627 | MORE
1628 | MOS
1629 | MOV
1630 | MPA
1631 | MPC
1632 | MPG
1633 | MPLX
1634 | MPO
1635 | MPV
1636 | MPW
1637 | MPX
1638 | MQT
1639 | MQY
1640 | MR
1641 | MRC
1642 | MRH
1643 | MRIN
1644 | MRK
1645 | MRO
1646 | MS
1647 | MSA
1648 | MSB
1649 | MSCA
1650 | MSCI
1651 | MSD
1652 | MSF
1653 | MSI
1654 | MSJ
1655 | MSK
1656 | MSL
1657 | MSM
1658 | MSO
1659 | MSP
1660 | MSZ
1661 | MT
1662 | MTB
1663 | MTCN
1664 | MTD
1665 | MTDR
1666 | MTG
1667 | MTH
1668 | MTL
1669 | MTN
1670 | MTOR
1671 | MTR
1672 | MTRN
1673 | MTS
1674 | MTT
1675 | MTU
1676 | MTW
1677 | MTX
1678 | MTZ
1679 | MUA
1680 | MUC
1681 | MUE
1682 | MUH
1683 | MUI
1684 | MUJ
1685 | MUR
1686 | MUS
1687 | MUSA
1688 | MUX
1689 | MVC
1690 | MVCB
1691 | MVNR
1692 | MVO
1693 | MVT
1694 | MW
1695 | MWA
1696 | MWE
1697 | MWG
1698 | MWO
1699 | MWR
1700 | MWV
1701 | MWW
1702 | MX
1703 | MXE
1704 | MXF
1705 | MXL
1706 | MY
1707 | MYC
1708 | MYCC
1709 | MYD
1710 | MYE
1711 | MYF
1712 | MYI
1713 | MYJ
1714 | MYM
1715 | MYN
1716 | MZF
1717 | N
1718 | NAC
1719 | NAD
1720 | NADL
1721 | NAN
1722 | NAO
1723 | NAP
1724 | NAT
1725 | NAV
1726 | NAZ
1727 | NBB
1728 | NBD
1729 | NBG
1730 | NBHC
1731 | NBL
1732 | NBR
1733 | NC
1734 | NCA
1735 | NCFT
1736 | NCI
1737 | NCR
1738 | NCS
1739 | NCT
1740 | NCV
1741 | NCZ
1742 | NDP
1743 | NDRO
1744 | NE
1745 | NEA
1746 | NEE
1747 | NEFF
1748 | NEM
1749 | NEP
1750 | NES
1751 | NEU
1752 | NEV
1753 | NEWM
1754 | NEWR
1755 | NFG
1756 | NFJ
1757 | NFX
1758 | NGG
1759 | NGL
1760 | NGLS
1761 | NGS
1762 | NGVC
1763 | NHF
1764 | NHI
1765 | NI
1766 | NID
1767 | NIE
1768 | NIM
1769 | NIO
1770 | NIQ
1771 | NJ
1772 | NJR
1773 | NKA
1774 | NKE
1775 | NKG
1776 | NKX
1777 | NL
1778 | NLS
1779 | NLSN
1780 | NLY
1781 | NM
1782 | NMA
1783 | NMBL
1784 | NMFC
1785 | NMI
1786 | NMM
1787 | NMO
1788 | NMR
1789 | NMS
1790 | NMT
1791 | NMY
1792 | NNA
1793 | NNC
1794 | NNI
1795 | NNN
1796 | NNP
1797 | NNY
1798 | NOA
1799 | NOAH
1800 | NOC
1801 | NOK
1802 | NOR
1803 | NORD
1804 | NOV
1805 | NOW
1806 | NP
1807 | NPD
1808 | NPF
1809 | NPI
1810 | NPK
1811 | NPM
1812 | NPO
1813 | NPP
1814 | NPT
1815 | NPTN
1816 | NPV
1817 | NQ
1818 | NQI
1819 | NQM
1820 | NQP
1821 | NQS
1822 | NQU
1823 | NR
1824 | NRF
1825 | NRG
1826 | NRK
1827 | NRP
1828 | NRT
1829 | NRZ
1830 | NS
1831 | NSAM
1832 | NSC
1833 | NSH
1834 | NSL
1835 | NSLP
1836 | NSM
1837 | NSP
1838 | NSR
1839 | NSS
1840 | NTC
1841 | NTG
1842 | NTI
1843 | NTL
1844 | NTP
1845 | NTT
1846 | NTX
1847 | NTZ
1848 | NU
1849 | NUE
1850 | NUM
1851 | NUO
1852 | NUS
1853 | NUV
1854 | NUW
1855 | NVGS
1856 | NVO
1857 | NVR
1858 | NVRO
1859 | NVS
1860 | NWE
1861 | NWHM
1862 | NWL
1863 | NWN
1864 | NWY
1865 | NX
1866 | NXC
1867 | NXJ
1868 | NXN
1869 | NXP
1870 | NXQ
1871 | NXR
1872 | NYCB
1873 | NYLD
1874 | NYRT
1875 | NYT
1876 | O
1877 | OAK
1878 | OAKS
1879 | OAS
1880 | OB
1881 | OC
1882 | OCIP
1883 | OCIR
1884 | OCN
1885 | OCR
1886 | ODC
1887 | OEC
1888 | OFC
1889 | OFG
1890 | OGE
1891 | OGS
1892 | OHI
1893 | OI
1894 | OIA
1895 | OIBR
1896 | OII
1897 | OILT
1898 | OIS
1899 | OKE
1900 | OKS
1901 | OLN
1902 | OLP
1903 | OMAM
1904 | OMC
1905 | OME
1906 | OMG
1907 | OMI
1908 | OMN
1909 | ONDK
1910 | ONE
1911 | OPK
1912 | OPWR
1913 | OPY
1914 | ORA
1915 | ORAN
1916 | ORB
1917 | ORC
1918 | ORCL
1919 | ORI
1920 | ORN
1921 | OSK
1922 | OUBS
1923 | OUT
1924 | OWW
1925 | OXM
1926 | OXY
1927 | OZM
1928 | P
1929 | PAA
1930 | PAC
1931 | PACD
1932 | PAG
1933 | PAGP
1934 | PAH
1935 | PAI
1936 | PAM
1937 | PANW
1938 | PAR
1939 | PAY
1940 | PAYC
1941 | PB
1942 | PBA
1943 | PBF
1944 | PBFX
1945 | PBH
1946 | PBI
1947 | PBR
1948 | PBT
1949 | PBY
1950 | PBYI
1951 | PCF
1952 | PCG
1953 | PCI
1954 | PCK
1955 | PCL
1956 | PCM
1957 | PCN
1958 | PCP
1959 | PCQ
1960 | PDI
1961 | PDM
1962 | PDS
1963 | PDT
1964 | PE
1965 | PEB
1966 | PEG
1967 | PEI
1968 | PEO
1969 | PEP
1970 | PER
1971 | PES
1972 | PF
1973 | PFD
1974 | PFE
1975 | PFG
1976 | PFH
1977 | PFK
1978 | PFL
1979 | PFN
1980 | PFO
1981 | PFS
1982 | PFSI
1983 | PFX
1984 | PG
1985 | PGEM
1986 | PGH
1987 | PGI
1988 | PGN
1989 | PGP
1990 | PGR
1991 | PGRE
1992 | PGZ
1993 | PH
1994 | PHD
1995 | PHG
1996 | PHH
1997 | PHI
1998 | PHK
1999 | PHM
2000 | PHT
2001 | PHX
2002 | PII
2003 | PIM
2004 | PIR
2005 | PIY
2006 | PJC
2007 | PJH
2008 | PJS
2009 | PKD
2010 | PKE
2011 | PKG
2012 | PKI
2013 | PKO
2014 | PKX
2015 | PKY
2016 | PL
2017 | PLD
2018 | PLL
2019 | PLOW
2020 | PLT
2021 | PM
2022 | PMC
2023 | PMF
2024 | PML
2025 | PMM
2026 | PMO
2027 | PMT
2028 | PMX
2029 | PNC
2030 | PNF
2031 | PNI
2032 | PNK
2033 | PNM
2034 | PNR
2035 | PNTA
2036 | PNW
2037 | PNX
2038 | PNY
2039 | POL
2040 | POM
2041 | POR
2042 | POST
2043 | POT
2044 | POWR
2045 | PPG
2046 | PPL
2047 | PPO
2048 | PPP
2049 | PPR
2050 | PPS
2051 | PPT
2052 | PPX
2053 | PQ
2054 | PRA
2055 | PRE
2056 | PRGO
2057 | PRH
2058 | PRI
2059 | PRLB
2060 | PRO
2061 | PRU
2062 | PRY
2063 | PSA
2064 | PSB
2065 | PSF
2066 | PSG
2067 | PSO
2068 | PSX
2069 | PSXP
2070 | PT
2071 | PTP
2072 | PTR
2073 | PTY
2074 | PUK
2075 | PVA
2076 | PVG
2077 | PVH
2078 | PVTD
2079 | PWE
2080 | PWR
2081 | PX
2082 | PXD
2083 | PYB
2084 | PYN
2085 | PYS
2086 | PYT
2087 | PZB
2088 | PZC
2089 | PZE
2090 | PZN
2091 | Q
2092 | QEP
2093 | QEPM
2094 | QIHU
2095 | QSR
2096 | QTM
2097 | QTS
2098 | QTWO
2099 | QUAD
2100 | R
2101 | RAD
2102 | RAI
2103 | RALY
2104 | RAS
2105 | RATE
2106 | RAX
2107 | RBA
2108 | RBC
2109 | RBS
2110 | RCAP
2111 | RCI
2112 | RCL
2113 | RCS
2114 | RDC
2115 | RDN
2116 | RDY
2117 | RE
2118 | REG
2119 | REN
2120 | RENN
2121 | RES
2122 | RESI
2123 | REV
2124 | REX
2125 | REXR
2126 | RF
2127 | RFI
2128 | RFP
2129 | RFT
2130 | RFTA
2131 | RGA
2132 | RGC
2133 | RGP
2134 | RGR
2135 | RGS
2136 | RGT
2137 | RH
2138 | RHI
2139 | RHP
2140 | RHT
2141 | RICE
2142 | RIG
2143 | RIGP
2144 | RIO
2145 | RIOM
2146 | RIT
2147 | RJD
2148 | RJF
2149 | RKT
2150 | RKUS
2151 | RL
2152 | RLD
2153 | RLGY
2154 | RLH
2155 | RLI
2156 | RLJ
2157 | RM
2158 | RMAX
2159 | RMD
2160 | RMP
2161 | RMT
2162 | RNDY
2163 | RNE
2164 | RNF
2165 | RNG
2166 | RNO
2167 | RNP
2168 | RNR
2169 | ROC
2170 | ROG
2171 | ROK
2172 | ROL
2173 | ROP
2174 | ROYT
2175 | RPAI
2176 | RPM
2177 | RPT
2178 | RQI
2179 | RRC
2180 | RRMS
2181 | RRTS
2182 | RS
2183 | RSE
2184 | RSG
2185 | RSH
2186 | RSO
2187 | RSPP
2188 | RST
2189 | RT
2190 | RTEC
2191 | RTI
2192 | RTN
2193 | RUBI
2194 | RUK
2195 | RVT
2196 | RWT
2197 | RXN
2198 | RY
2199 | RYAM
2200 | RYI
2201 | RYL
2202 | RYN
2203 | RZA
2204 | S
2205 | SA
2206 | SAH
2207 | SAIC
2208 | SALT
2209 | SAM
2210 | SAN
2211 | SAP
2212 | SAQ
2213 | SAR
2214 | SB
2215 | SBGL
2216 | SBH
2217 | SBNA
2218 | SBNB
2219 | SBR
2220 | SBS
2221 | SBW
2222 | SBY
2223 | SC
2224 | SCCO
2225 | SCD
2226 | SCG
2227 | SCHW
2228 | SCI
2229 | SCL
2230 | SCM
2231 | SCQ
2232 | SCS
2233 | SCU
2234 | SCX
2235 | SD
2236 | SDLP
2237 | SDR
2238 | SDRL
2239 | SDT
2240 | SE
2241 | SEAS
2242 | SEE
2243 | SEM
2244 | SEMG
2245 | SEP
2246 | SERV
2247 | SF
2248 | SFB
2249 | SFE
2250 | SFG
2251 | SFL
2252 | SFN
2253 | SFS
2254 | SFUN
2255 | SFY
2256 | SGF
2257 | SGL
2258 | SGM
2259 | SGU
2260 | SGY
2261 | SGZA
2262 | SHG
2263 | SHI
2264 | SHLX
2265 | SHO
2266 | SHW
2267 | SID
2268 | SIG
2269 | SIR
2270 | SIX
2271 | SJI
2272 | SJM
2273 | SJR
2274 | SJT
2275 | SJW
2276 | SKH
2277 | SKM
2278 | SKT
2279 | SKX
2280 | SLB
2281 | SLCA
2282 | SLF
2283 | SLG
2284 | SLH
2285 | SLRA
2286 | SLTB
2287 | SLW
2288 | SM
2289 | SMFG
2290 | SMG
2291 | SMI
2292 | SMLP
2293 | SMM
2294 | SMP
2295 | SN
2296 | SNA
2297 | SNE
2298 | SNH
2299 | SNHN
2300 | SNI
2301 | SNN
2302 | SNOW
2303 | SNP
2304 | SNR
2305 | SNV
2306 | SNX
2307 | SNY
2308 | SO
2309 | SOL
2310 | SON
2311 | SOR
2312 | SPA
2313 | SPB
2314 | SPE
2315 | SPF
2316 | SPG
2317 | SPH
2318 | SPLP
2319 | SPN
2320 | SPR
2321 | SPW
2322 | SPXX
2323 | SQM
2324 | SQNS
2325 | SR
2326 | SRC
2327 | SRE
2328 | SRF
2329 | SRI
2330 | SRLP
2331 | SRT
2332 | SRV
2333 | SSD
2334 | SSE
2335 | SSI
2336 | SSL
2337 | SSLT
2338 | SSNI
2339 | SSP
2340 | SSS
2341 | SSTK
2342 | SSW
2343 | SSWN
2344 | ST
2345 | STAG
2346 | STAR
2347 | STAY
2348 | STC
2349 | STE
2350 | STI
2351 | STJ
2352 | STK
2353 | STL
2354 | STM
2355 | STN
2356 | STNG
2357 | STO
2358 | STON
2359 | STOR
2360 | STR
2361 | STRI
2362 | STT
2363 | STV
2364 | STWD
2365 | STZ
2366 | SU
2367 | SUI
2368 | SUN
2369 | SUNE
2370 | SUP
2371 | SVM
2372 | SVU
2373 | SWAY
2374 | SWC
2375 | SWFT
2376 | SWH
2377 | SWI
2378 | SWJ
2379 | SWK
2380 | SWM
2381 | SWN
2382 | SWU
2383 | SWX
2384 | SWY
2385 | SWZ
2386 | SXC
2387 | SXCP
2388 | SXE
2389 | SXI
2390 | SXL
2391 | SXT
2392 | SYA
2393 | SYF
2394 | SYK
2395 | SYT
2396 | SYX
2397 | SYY
2398 | SZC
2399 | T
2400 | TA
2401 | TAC
2402 | TAHO
2403 | TAI
2404 | TAL
2405 | TANN
2406 | TANO
2407 | TAOM
2408 | TAP
2409 | TARO
2410 | TBI
2411 | TC
2412 | TCAP
2413 | TCB
2414 | TCC
2415 | TCCA
2416 | TCI
2417 | TCK
2418 | TCO
2419 | TCP
2420 | TCPI
2421 | TCRX
2422 | TCS
2423 | TD
2424 | TDA
2425 | TDC
2426 | TDE
2427 | TDF
2428 | TDG
2429 | TDI
2430 | TDJ
2431 | TDS
2432 | TDW
2433 | TDY
2434 | TE
2435 | TEF
2436 | TEG
2437 | TEI
2438 | TEL
2439 | TEN
2440 | TEO
2441 | TEP
2442 | TER
2443 | TEU
2444 | TEVA
2445 | TEX
2446 | TFG
2447 | TFX
2448 | TG
2449 | TGH
2450 | TGI
2451 | TGP
2452 | TGS
2453 | TGT
2454 | THC
2455 | THG
2456 | THGA
2457 | THO
2458 | THQ
2459 | THR
2460 | THS
2461 | TI
2462 | TIF
2463 | TIME
2464 | TISI
2465 | TJX
2466 | TK
2467 | TKC
2468 | TKF
2469 | TKR
2470 | TLI
2471 | TLK
2472 | TLLP
2473 | TLM
2474 | TLP
2475 | TLYS
2476 | TM
2477 | TMH
2478 | TMHC
2479 | TMK
2480 | TMO
2481 | TMST
2482 | TMUS
2483 | TNC
2484 | TNET
2485 | TNH
2486 | TNK
2487 | TNP
2488 | TOL
2489 | TOO
2490 | TOT
2491 | TOWR
2492 | TPC
2493 | TPH
2494 | TPL
2495 | TPRE
2496 | TPUB
2497 | TPVG
2498 | TPX
2499 | TPZ
2500 | TR
2501 | TRC
2502 | TRCO
2503 | TREC
2504 | TREX
2505 | TRF
2506 | TRGP
2507 | TRI
2508 | TRK
2509 | TRLA
2510 | TRMR
2511 | TRN
2512 | TRNO
2513 | TROX
2514 | TRP
2515 | TRQ
2516 | TRR
2517 | TRUP
2518 | TRV
2519 | TRW
2520 | TS
2521 | TSE
2522 | TSI
2523 | TSL
2524 | TSLF
2525 | TSLX
2526 | TSM
2527 | TSN
2528 | TSNU
2529 | TSO
2530 | TSQ
2531 | TSS
2532 | TSU
2533 | TTC
2534 | TTF
2535 | TTI
2536 | TTM
2537 | TTP
2538 | TU
2539 | TUMI
2540 | TUP
2541 | TV
2542 | TVC
2543 | TVE
2544 | TVPT
2545 | TW
2546 | TWC
2547 | TWI
2548 | TWN
2549 | TWO
2550 | TWTR
2551 | TWX
2552 | TX
2553 | TXT
2554 | TXTR
2555 | TY
2556 | TYC
2557 | TYG
2558 | TYL
2559 | TZF
2560 | UA
2561 | UAL
2562 | UAM
2563 | UAN
2564 | UBA
2565 | UBP
2566 | UBS
2567 | UCP
2568 | UDR
2569 | UFI
2570 | UFS
2571 | UGI
2572 | UGP
2573 | UHS
2574 | UHT
2575 | UIL
2576 | UIS
2577 | UL
2578 | UMC
2579 | UMH
2580 | UN
2581 | UNF
2582 | UNH
2583 | UNM
2584 | UNP
2585 | UNT
2586 | UPL
2587 | UPS
2588 | URI
2589 | USA
2590 | USAC
2591 | USB
2592 | USDP
2593 | USG
2594 | USM
2595 | USNA
2596 | USPH
2597 | UTF
2598 | UTI
2599 | UTL
2600 | UTX
2601 | UVE
2602 | UVV
2603 | UZA
2604 | UZB
2605 | V
2606 | VAC
2607 | VAL
2608 | VALE
2609 | VAR
2610 | VBF
2611 | VC
2612 | VCO
2613 | VCRA
2614 | VCV
2615 | VEC
2616 | VEEV
2617 | VET
2618 | VFC
2619 | VG
2620 | VGI
2621 | VGM
2622 | VGR
2623 | VHI
2624 | VIPS
2625 | VIV
2626 | VJET
2627 | VKQ
2628 | VLO
2629 | VLP
2630 | VLRS
2631 | VLT
2632 | VLY
2633 | VMC
2634 | VMEM
2635 | VMI
2636 | VMO
2637 | VMW
2638 | VNCE
2639 | VNO
2640 | VNTV
2641 | VOC
2642 | VOYA
2643 | VPG
2644 | VPV
2645 | VR
2646 | VRS
2647 | VRTV
2648 | VRX
2649 | VSH
2650 | VSI
2651 | VSLR
2652 | VTA
2653 | VTN
2654 | VTR
2655 | VTRB
2656 | VTTI
2657 | VVC
2658 | VVI
2659 | VVR
2660 | VZ
2661 | VZA
2662 | W
2663 | WAB
2664 | WAC
2665 | WAGE
2666 | WAIR
2667 | WAL
2668 | WAT
2669 | WBAI
2670 | WBC
2671 | WBK
2672 | WBS
2673 | WCC
2674 | WCG
2675 | WCIC
2676 | WCN
2677 | WD
2678 | WDAY
2679 | WDR
2680 | WEA
2681 | WEC
2682 | WES
2683 | WEX
2684 | WF
2685 | WFC
2686 | WFT
2687 | WG
2688 | WGL
2689 | WGO
2690 | WGP
2691 | WHG
2692 | WHR
2693 | WHX
2694 | WHZ
2695 | WIA
2696 | WIT
2697 | WIW
2698 | WK
2699 | WLH
2700 | WLK
2701 | WLKP
2702 | WLL
2703 | WLT
2704 | WM
2705 | WMB
2706 | WMC
2707 | WMK
2708 | WMLP
2709 | WMS
2710 | WMT
2711 | WNC
2712 | WNR
2713 | WNRL
2714 | WNS
2715 | WOR
2716 | WPC
2717 | WPG
2718 | WPP
2719 | WPT
2720 | WPX
2721 | WPZ
2722 | WR
2723 | WRB
2724 | WRE
2725 | WRI
2726 | WRT
2727 | WSH
2728 | WSM
2729 | WSO
2730 | WSR
2731 | WST
2732 | WTI
2733 | WTM
2734 | WTR
2735 | WTS
2736 | WTW
2737 | WU
2738 | WUBA
2739 | WWAV
2740 | WWE
2741 | WWW
2742 | WX
2743 | WY
2744 | WYN
2745 | X
2746 | XCO
2747 | XEC
2748 | XEL
2749 | XIN
2750 | XKE
2751 | XL
2752 | XLS
2753 | XNY
2754 | XOM
2755 | XON
2756 | XOXO
2757 | XPO
2758 | XRM
2759 | XRS
2760 | XRX
2761 | XUE
2762 | XYL
2763 | Y
2764 | YDKN
2765 | YELP
2766 | YGE
2767 | YOKU
2768 | YPF
2769 | YUM
2770 | YUME
2771 | YZC
2772 | ZA
2773 | ZAYO
2774 | ZBK
2775 | ZEN
2776 | ZEP
2777 | ZF
2778 | ZFC
2779 | ZMH
2780 | ZNH
2781 | ZOES
2782 | ZPIN
2783 | ZQK
2784 | ZTR
2785 | ZTS
2786 | ZX
--------------------------------------------------------------------------------
/src/generators/common_log.rs:
--------------------------------------------------------------------------------
1 | use crate::generators::Generator;
2 | use crate::Format;
3 | use chrono::{DateTime, Local};
4 | use fake::faker::filesystem::en::FilePath;
5 | use fake::faker::internet::en::{UserAgent, Username, IP};
6 | use fake::Fake;
7 | use rand::prelude::IteratorRandom;
8 | use rand::rngs::ThreadRng;
9 | use rand::Rng;
10 | use serde::Serialize;
11 | use std::fmt::Display;
12 |
13 | pub struct CommonLogGenerator {
14 | format: Format,
15 | rand: ThreadRng,
16 | }
17 |
18 | const ATTACKER: &str = "34.127.44.91";
19 |
20 | #[derive(Debug, Serialize)]
21 | pub struct CommonLog {
22 | ip: String,
23 | identity: String,
24 | user_id: String,
25 | timestamp: DateTime,
26 | request: String,
27 | status_code: u16,
28 | size: u32,
29 | referer: String,
30 | user_agent: String,
31 | }
32 |
33 | const HTTP_METHODS: [&str; 4] = ["GET", "POST", "PUT", "DELETE"];
34 |
35 | fn get_method(rng: &mut ThreadRng) -> &'static str {
36 | for method in HTTP_METHODS {
37 | if rng.gen_bool(0.9) {
38 | return method;
39 | }
40 | }
41 |
42 | HTTP_METHODS.last().unwrap()
43 | }
44 |
45 | const STATUS_CODES: [u16; 7] = [200u16, 400, 401, 403, 404, 405, 500];
46 |
47 | fn get_status_code(rng: &mut ThreadRng) -> http::StatusCode {
48 | http::StatusCode::from_u16(*STATUS_CODES.iter().choose(rng).unwrap()).unwrap()
49 | }
50 |
51 | impl CommonLog {
52 | fn rand(rng: &mut ThreadRng) -> Self {
53 | let (ip, status_code) = if rng.gen_bool(0.05) {
54 | (ATTACKER.to_string(), http::StatusCode::UNAUTHORIZED)
55 | } else {
56 | (IP().fake_with_rng(rng), get_status_code(rng))
57 | };
58 |
59 | CommonLog {
60 | ip,
61 | identity: "-".to_string(),
62 | user_id: Username().fake_with_rng(rng),
63 | timestamp: Local::now(),
64 | request: format!(
65 | "{} {}",
66 | get_method(rng),
67 | FilePath().fake_with_rng::(rng)
68 | ),
69 | status_code: status_code.as_u16(),
70 | size: rng.gen_range(500..10000),
71 | referer: "-".to_string(),
72 | user_agent: UserAgent().fake_with_rng(rng),
73 | }
74 | }
75 | }
76 |
77 | impl Display for CommonLog {
78 | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
79 | write!(
80 | f,
81 | "{} {} {} [{}] \"{}\" {} {} \"{}\" \"{}\"",
82 | self.ip,
83 | self.identity,
84 | self.user_id,
85 | self.timestamp.format("%d/%b/%Y:%H:%M:%S %z"),
86 | self.request,
87 | self.status_code,
88 | self.size,
89 | self.referer,
90 | self.user_agent,
91 | )
92 | }
93 | }
94 |
95 | impl CommonLogGenerator {
96 | pub fn new(format: Format) -> CommonLogGenerator {
97 | CommonLogGenerator {
98 | format: format,
99 | rand: rand::thread_rng(),
100 | }
101 | }
102 | }
103 |
104 | impl Generator for CommonLogGenerator {
105 | fn generate(&mut self) -> Vec {
106 | let log = CommonLog::rand(&mut self.rand);
107 | match self.format {
108 | Format::String => log.to_string().into_bytes(),
109 | Format::Json => serde_json::to_vec(&log).unwrap(),
110 | }
111 | }
112 | }
113 |
--------------------------------------------------------------------------------
/src/generators/mod.rs:
--------------------------------------------------------------------------------
1 | use crate::Format;
2 | use serde::Serialize;
3 |
4 | pub mod common_log;
5 | pub mod schematized;
6 |
7 | pub trait Generator {
8 | fn generate(&mut self) -> Vec;
9 | }
10 |
11 | pub struct ImpulseGen {
12 | counter: usize,
13 | format: Format,
14 | }
15 |
16 | impl ImpulseGen {
17 | pub fn new(format: Format) -> Self {
18 | ImpulseGen { counter: 0, format }
19 | }
20 | }
21 |
22 | #[derive(Serialize, Debug, Copy, Clone)]
23 | struct ImpulseData {
24 | id: usize,
25 | }
26 |
27 | impl Generator for ImpulseGen {
28 | fn generate(&mut self) -> Vec {
29 | let data = ImpulseData { id: self.counter };
30 | self.counter += 1;
31 |
32 | match self.format {
33 | Format::String => format!("{}", data.id).into_bytes(),
34 | Format::Json => serde_json::to_vec(&data).unwrap(),
35 | }
36 | }
37 | }
38 |
--------------------------------------------------------------------------------
/src/generators/schematized.rs:
--------------------------------------------------------------------------------
1 | use crate::generators::Generator;
2 | use crate::Format;
3 | use chrono::Local;
4 | use fake::faker::address::en::{CityName, StateAbbr, StreetName, ZipCode};
5 | use fake::faker::internet::en::Username;
6 | use fake::faker::name::en::Name;
7 | use fake::{Fake, Faker};
8 | use rand::prelude::SliceRandom;
9 | use rand::rngs::ThreadRng;
10 | use rand::Rng;
11 | use serde::Serialize;
12 | use std::fmt::Debug;
13 | use std::marker::PhantomData;
14 | use std::sync::OnceLock;
15 |
16 | const SYMBOLS: &str = include_str!("../../resources/symbols.txt");
17 |
18 | static SYMBOLS_LIST: OnceLock> = OnceLock::new();
19 |
20 | pub trait Schema: Debug + Serialize {
21 | fn generate(rng: &mut ThreadRng) -> Self;
22 | }
23 |
24 | #[derive(Debug, Clone, Serialize)]
25 | pub struct OrderRecord {
26 | pub order_id: u32,
27 | pub user_id: String,
28 | pub order_date: chrono::DateTime,
29 | pub total_amount: u64,
30 |
31 | pub name: String,
32 | pub address: String,
33 | pub city: String,
34 | pub state: String,
35 | pub zip: String,
36 | }
37 |
38 | impl Schema for OrderRecord {
39 | fn generate(rng: &mut ThreadRng) -> Self {
40 | OrderRecord {
41 | order_id: Faker.fake_with_rng(rng),
42 | user_id: Username().fake_with_rng(rng),
43 | order_date: Local::now(),
44 | total_amount: rng.gen_range(100..50000),
45 | name: Name().fake_with_rng(rng),
46 | address: format!(
47 | "{} {}",
48 | rng.gen_range(1..1000),
49 | StreetName().fake_with_rng::(rng)
50 | ),
51 | city: CityName().fake_with_rng(rng),
52 | state: StateAbbr().fake_with_rng(rng),
53 | zip: ZipCode().fake_with_rng(rng),
54 | }
55 | }
56 | }
57 |
58 | #[derive(Debug, Clone, Serialize)]
59 | pub struct StockTrade {
60 | pub user_id: String,
61 | pub account_id: usize,
62 | pub symbol: String,
63 | pub side: String,
64 | pub unit_price: u64,
65 | pub units: u32,
66 | pub timestamp: chrono::DateTime,
67 | }
68 |
69 | impl Schema for StockTrade {
70 | fn generate(rng: &mut ThreadRng) -> Self {
71 | let symbols = SYMBOLS_LIST.get_or_init(|| SYMBOLS.lines().collect());
72 |
73 | StockTrade {
74 | user_id: Username().fake_with_rng(rng),
75 | account_id: rng.gen_range(1000..2000),
76 | symbol: symbols.choose(rng).unwrap().to_string(),
77 | side: if rng.gen_bool(0.5) { "buy" } else { "sell" }.to_string(),
78 | unit_price: rng.gen_range(1000..100000),
79 | units: rng.gen_range(1..100),
80 | timestamp: Local::now(),
81 | }
82 | }
83 | }
84 |
85 | pub struct SchemaGenerator {
86 | rand: ThreadRng,
87 | format: Format,
88 | _t: PhantomData,
89 | }
90 |
91 | impl SchemaGenerator {
92 | pub fn new(format: Format) -> Self {
93 | SchemaGenerator {
94 | format,
95 | rand: rand::thread_rng(),
96 | _t: PhantomData,
97 | }
98 | }
99 | }
100 |
101 | impl Generator for SchemaGenerator {
102 | fn generate(&mut self) -> Vec {
103 | let record = T::generate(&mut self.rand);
104 |
105 | match self.format {
106 | Format::String => format!("{:?}", record).into_bytes(),
107 | Format::Json => serde_json::to_vec(&record).unwrap(),
108 | }
109 | }
110 | }
111 |
--------------------------------------------------------------------------------
/src/main.rs:
--------------------------------------------------------------------------------
1 | mod generators;
2 | mod writers;
3 |
4 | use crate::generators::schematized::{OrderRecord, StockTrade};
5 | use crate::generators::Generator;
6 | use crate::writers::kafka::KafkaConfig;
7 | use crate::writers::sse::SSEConfig;
8 | use crate::writers::stdout::StdoutConfig;
9 | use crate::writers::GenWriter;
10 | use clap::{Parser, Subcommand, ValueEnum};
11 | use tracing_subscriber::layer::SubscriberExt;
12 | use tracing_subscriber::util::SubscriberInitExt;
13 |
14 | #[derive(Debug, Clone, Copy, ValueEnum)]
15 | pub enum Format {
16 | String,
17 | Json,
18 | }
19 |
20 | #[derive(Debug, Clone, Copy, ValueEnum)]
21 | pub enum GeneratorSpec {
22 | CommonLog,
23 | Impulse,
24 | Order,
25 | StockTrade,
26 | }
27 |
28 | impl GeneratorSpec {
29 | pub fn generator(&self, format: Format) -> Box {
30 | match self {
31 | GeneratorSpec::CommonLog => {
32 | Box::new(generators::common_log::CommonLogGenerator::new(format))
33 | }
34 | GeneratorSpec::Impulse => Box::new(generators::ImpulseGen::new(format)),
35 | GeneratorSpec::Order => {
36 | Box::new(generators::schematized::SchemaGenerator::::new(format))
37 | }
38 | GeneratorSpec::StockTrade => Box::new(generators::schematized::SchemaGenerator::<
39 | StockTrade,
40 | >::new(format)),
41 | }
42 | }
43 | }
44 |
45 | /// Generate realistic streaming data for testing stream processing applications
46 | #[derive(Parser)]
47 | #[command(author, version, about, long_about = None)]
48 | struct Cli {
49 | /// Type of data to generator
50 | spec: GeneratorSpec,
51 |
52 | /// Format of the generated data
53 | #[arg(short, long)]
54 | format: Option,
55 |
56 | /// Rate of generation in records per second
57 | #[arg(short, long)]
58 | rate: Option,
59 |
60 | /// Max number of records to generate
61 | #[arg(short, long)]
62 | limit: Option,
63 |
64 | /// Controls where the generated data is sent
65 | #[command(subcommand)]
66 | output: Option,
67 | }
68 |
69 | #[derive(Clone, Debug, Subcommand)]
70 | pub enum OutputCommand {
71 | /// Write outputs to stdout
72 | Stdout(StdoutConfig),
73 | /// Run a Server-Sent Events server
74 | SSE(SSEConfig),
75 | /// Write outputs to Kafka
76 | Kafka(KafkaConfig),
77 | }
78 |
79 | impl OutputCommand {
80 | pub fn writer(&self) -> Box {
81 | match self {
82 | OutputCommand::Stdout(config) => config.to_writer(),
83 | OutputCommand::SSE(config) => config.to_writer(),
84 | OutputCommand::Kafka(config) => config.to_writer(),
85 | }
86 | }
87 | }
88 |
89 | #[tokio::main]
90 | pub async fn main() {
91 | tracing_subscriber::registry()
92 | .with(
93 | tracing_subscriber::EnvFilter::try_from_default_env().unwrap_or_else(|_| "info".into()),
94 | )
95 | .with(tracing_subscriber::fmt::layer().with_writer(std::io::stderr))
96 | .init();
97 |
98 | let cli = Cli::parse();
99 |
100 | let mut generator = cli.spec.generator(cli.format.unwrap_or(Format::Json));
101 |
102 | let mut writer = cli
103 | .output
104 | .unwrap_or(OutputCommand::Stdout(StdoutConfig {}))
105 | .writer();
106 |
107 | let mut count = 0;
108 | while count < cli.limit.unwrap_or(usize::MAX) {
109 | let data = generator.generate();
110 | writer.write(data).await;
111 | count += 1;
112 |
113 | tokio::time::sleep(std::time::Duration::from_secs_f32(
114 | 1.0 / cli.rate.unwrap_or(50.0),
115 | ))
116 | .await;
117 | }
118 | }
119 |
--------------------------------------------------------------------------------
/src/writers/kafka/mod.rs:
--------------------------------------------------------------------------------
1 | #[cfg(feature = "kafka")]
2 | mod writer;
3 |
4 | use crate::writers::GenWriter;
5 | use clap::Args;
6 |
7 | #[derive(Clone, Debug, Args)]
8 | pub struct KafkaConfig {
9 | /// Kafka bootstrap servers
10 | #[arg(long)]
11 | bootstrap_servers: String,
12 |
13 | /// Kafka topic
14 | #[arg(long)]
15 | topic: String,
16 |
17 | /// Set Kafka options as key=value pairs
18 | #[arg(long)]
19 | options: Option>,
20 | }
21 |
22 | impl KafkaConfig {
23 | pub fn to_writer(&self) -> Box {
24 | #[cfg(feature = "kafka")]
25 | {
26 | Box::new(writer::KafkaWriter::new(self))
27 | }
28 |
29 | #[cfg(not(feature = "kafka"))]
30 | {
31 | panic!("streamgen was not compiled with Kafka support; recompile with --features kafka to use this writer")
32 | }
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/src/writers/kafka/writer.rs:
--------------------------------------------------------------------------------
1 | use crate::writers::kafka::KafkaConfig;
2 | use crate::writers::GenWriter;
3 | use async_trait::async_trait;
4 | use rdkafka::error::{KafkaError, RDKafkaErrorCode};
5 | use rdkafka::producer::{DeliveryFuture, FutureProducer};
6 | use std::time::Duration;
7 | use tracing::info;
8 | use uuid::Uuid;
9 |
10 | pub struct KafkaWriter {
11 | topic: String,
12 | future_producer: FutureProducer,
13 | }
14 |
15 | impl KafkaWriter {
16 | pub fn new(config: &KafkaConfig) -> Self {
17 | let mut client_config = rdkafka::ClientConfig::new();
18 | client_config.set("bootstrap.servers", &config.bootstrap_servers);
19 |
20 | if let Some(options) = &config.options {
21 | for option in options {
22 | let parts: Vec<&str> = option.splitn(2, '=').collect();
23 | if parts.len() != 2 {
24 | panic!("invalid option: {}", option);
25 | }
26 | client_config.set(parts[0].to_string(), parts[1].to_string());
27 | }
28 | }
29 |
30 | let producer: FutureProducer = client_config.create().unwrap();
31 |
32 | info!("Writing to kafka topic: {}...", config.topic);
33 |
34 | KafkaWriter {
35 | topic: config.topic.clone(),
36 | future_producer: producer,
37 | }
38 | }
39 |
40 | async fn publish(&mut self, data: Vec) -> DeliveryFuture {
41 | let key = Uuid::new_v4().to_string();
42 | let mut record = rdkafka::producer::FutureRecord::to(&self.topic)
43 | .key(key.as_bytes())
44 | .payload(&data);
45 |
46 | loop {
47 | match self.future_producer.send_result(record) {
48 | Ok(future) => {
49 | return future;
50 | }
51 | Err((KafkaError::MessageProduction(RDKafkaErrorCode::QueueFull), f)) => {
52 | record = f;
53 | }
54 | Err((e, _)) => {
55 | panic!("Unhandled kafka error: {:?}", e);
56 | }
57 | }
58 |
59 | // back off and retry
60 | tokio::time::sleep(Duration::from_millis(50)).await;
61 | }
62 | }
63 | }
64 |
65 | #[async_trait]
66 | impl GenWriter for KafkaWriter {
67 | async fn write(&mut self, data: Vec) {
68 | let future = self.publish(data).await;
69 |
70 | tokio::spawn(async move {
71 | match future.await {
72 | Ok(_) => {}
73 | Err(e) => {
74 | eprintln!("Error publishing to kafka: {:?}", e);
75 | }
76 | }
77 | });
78 | }
79 | }
80 |
--------------------------------------------------------------------------------
/src/writers/mod.rs:
--------------------------------------------------------------------------------
1 | use async_trait::async_trait;
2 |
3 | pub mod kafka;
4 | pub mod sse;
5 | pub mod stdout;
6 |
7 | #[async_trait]
8 | pub trait GenWriter {
9 | async fn write(&mut self, data: Vec);
10 | }
11 |
--------------------------------------------------------------------------------
/src/writers/sse.rs:
--------------------------------------------------------------------------------
1 | use crate::writers::GenWriter;
2 | use async_trait::async_trait;
3 | use axum::extract::State;
4 | use axum::response::sse::{Event, KeepAlive};
5 | use axum::response::Sse;
6 | use axum::routing::get;
7 | use axum::Router;
8 | use clap::Args;
9 | use http::{HeaderMap, HeaderName};
10 | use std::collections::BTreeMap;
11 | use std::convert::Infallible;
12 | use std::str::FromStr;
13 | use std::sync::Arc;
14 | use tokio::sync::broadcast;
15 | use tokio::sync::mpsc::Receiver;
16 | use tokio_stream::wrappers::BroadcastStream;
17 | use tokio_stream::{Stream, StreamExt};
18 | use tracing::info;
19 |
20 | const MAX_HISTORY: usize = 10_000;
21 |
22 | pub struct SSEServer {
23 | event_stream: Receiver>,
24 | }
25 |
26 | #[derive(Clone, Debug, Args)]
27 | pub struct SSEConfig {
28 | /// Port for SSE server
29 | #[arg(long)]
30 | port: Option,
31 | }
32 |
33 | impl SSEConfig {
34 | pub fn to_writer(&self) -> Box {
35 | Box::new(SSEWriter::new(self.port.unwrap_or(9563)))
36 | }
37 | }
38 |
39 | #[derive(Clone)]
40 | pub struct ServerState {
41 | events: Arc>>>,
42 | rx: Arc)>>,
43 | }
44 |
45 | impl SSEServer {
46 | pub async fn start(mut self, port: u16) {
47 | let events = Arc::new(tokio::sync::Mutex::new(BTreeMap::new()));
48 | let (tx, rx) = broadcast::channel(10);
49 |
50 | {
51 | let events = events.clone();
52 | let mut counter = 0;
53 | tokio::spawn(async move {
54 | while let Some(data) = self.event_stream.recv().await {
55 | {
56 | let mut events = events.lock().await;
57 | events.insert(counter, data.clone());
58 | counter += 1;
59 | if counter > MAX_HISTORY {
60 | events.remove(&(counter - MAX_HISTORY));
61 | }
62 | }
63 |
64 | tx.send((counter, data)).unwrap();
65 | }
66 | });
67 | }
68 |
69 | let state = ServerState {
70 | events,
71 | rx: Arc::new(rx),
72 | };
73 |
74 | let app = Router::new()
75 | .route("/sse", get(sse_handler))
76 | .with_state(state);
77 |
78 | // run it
79 | let listener = tokio::net::TcpListener::bind(format!("127.0.0.1:{}", port))
80 | .await
81 | .unwrap();
82 | info!("listening on {}", listener.local_addr().unwrap());
83 | axum::serve(listener, app).await.unwrap();
84 | }
85 | }
86 |
87 | async fn sse_handler(
88 | headers: HeaderMap,
89 | State(state): State,
90 | ) -> Sse>> {
91 | let last_event: Option = headers
92 | .get(HeaderName::from_str("Last-Event-ID").unwrap())
93 | .iter()
94 | .flat_map(|hv| hv.to_str().ok())
95 | .flat_map(|v| v.parse::().ok())
96 | .next();
97 |
98 | let mut rx: broadcast::Receiver<(usize, Vec)> = state.rx.resubscribe();
99 | let (id, _) = rx.recv().await.unwrap();
100 |
101 | let backfill: Vec<(usize, Vec)> = if let Some(last_event) = last_event {
102 | let events = state.events.lock().await;
103 | if events.contains_key(&last_event) {
104 | events
105 | .range(last_event..id)
106 | .map(|(id, record)| (*id, record.clone()))
107 | .collect()
108 | } else {
109 | vec![]
110 | }
111 | } else {
112 | vec![]
113 | };
114 |
115 | let stream = tokio_stream::iter(backfill.into_iter())
116 | .chain(BroadcastStream::new(rx).map(|t| t.unwrap()))
117 | .map(|(id, message)| {
118 | Ok(Event::default()
119 | .id(id.to_string())
120 | .data(String::from_utf8(message).unwrap()))
121 | });
122 |
123 | Sse::new(stream).keep_alive(KeepAlive::default())
124 | }
125 |
126 | pub struct SSEWriter {
127 | tx: tokio::sync::mpsc::Sender>,
128 | }
129 |
130 | impl SSEWriter {
131 | pub fn new(port: u16) -> Self {
132 | let (tx, rx) = tokio::sync::mpsc::channel(1000);
133 |
134 | let server = SSEServer { event_stream: rx };
135 |
136 | tokio::spawn(async move {
137 | server.start(port).await;
138 | });
139 |
140 | SSEWriter { tx }
141 | }
142 | }
143 |
144 | #[async_trait]
145 | impl GenWriter for SSEWriter {
146 | async fn write(&mut self, data: Vec) {
147 | self.tx.send(data).await.unwrap();
148 | }
149 | }
150 |
--------------------------------------------------------------------------------
/src/writers/stdout.rs:
--------------------------------------------------------------------------------
1 | use crate::writers::GenWriter;
2 | use async_trait::async_trait;
3 | use clap::Args;
4 | use std::io::Write;
5 |
6 | pub struct StdoutWriter {
7 | stdout: std::io::Stdout,
8 | }
9 |
10 | #[derive(Clone, Debug, Args)]
11 | pub struct StdoutConfig {}
12 |
13 | impl StdoutConfig {
14 | pub fn to_writer(&self) -> Box {
15 | Box::new(StdoutWriter::new())
16 | }
17 | }
18 |
19 | impl StdoutWriter {
20 | pub fn new() -> Self {
21 | StdoutWriter {
22 | stdout: std::io::stdout(),
23 | }
24 | }
25 | }
26 |
27 | #[async_trait]
28 | impl GenWriter for StdoutWriter {
29 | async fn write(&mut self, data: Vec) {
30 | self.stdout.write_all(&data).unwrap();
31 | write!(self.stdout, "\n").unwrap();
32 | }
33 | }
34 |
--------------------------------------------------------------------------------