1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
//! EV-invest's shared Rust libraries, one per Cargo feature.
//!
//! Each library is a self-contained module gated behind a feature flag, so a
//! consumer pulls in only what it asks for and nothing else is compiled:
//!
//! ```toml
//! ev_lib = { git = "https://github.com/EV-invest/lib.git", default-features = false, features = ["architecture"] }
//! ```
//!
//! # Available features
//!
//! - **`architecture`** — generic, I/O-free, `wasm32`-safe DDD tactical kernel
//! (typed ids, entities, aggregate roots, repositories, gateways, the unit of
//! work, domain events, specifications). See [`architecture`].
//! - **`uikit`** — dep-light Dioxus UI kit (mirrors `@evinvest/uikit`). See [`uikit`].
//! - **`analytics`** — PostHog product analytics (mirrors `@evinvest/analytics`):
//! native async capture over `reqwest`; pure-Rust fetch on the Dioxus/wasm
//! frontend. Does network I/O — opt-in, not the kernel. See [`analytics`].
//! - **`error_monitoring`** — Sentry error monitoring (mirrors
//! `@evinvest/error-monitoring`): native backend on the `sentry` crate; pure-Rust
//! envelope POST + panic hook on the Dioxus/wasm frontend. See [`error_monitoring`].
//! - **`experiments`** — frontend-only A/B testing (mirrors `@evinvest/experiments`):
//! cookie-bucketed variant assignment; exposure is reported through an injected
//! sink, so it never imports `analytics`. See [`experiments`].
//! - **`settings`** — typed env settings (mirrors `@evinvest/settings`): the
//! `settings!` macro reads env vars into a validated struct with aggregate
//! error reporting and secret redaction. Zero deps; sops stays at the shell/CI
//! boundary. See [`settings`](mod@settings).
//! - **`types`** — shared domain TypeObjects (mirrors `@evinvest/types`):
//! [`PhoneNumber`](types::PhoneNumber) with E.164 validation and formatting, plus
//! the generic [`Branded<T, B>`](types::Branded) newtype for future types (Email,
//! Currency, …). Zero deps, wasm-safe. See [`types`](mod@types).
//! - **`otel`** — OpenTelemetry logs + traces over OTLP (native backends only;
//! inert on wasm): two `tracing` layers + a flush guard, and tonic
//! interceptors for W3C trace propagation. See [`otel`].
//! - **`i18n`** — five-locale internationalisation (mirrors `@evinvest/i18n`):
//! the locale registry, the `/<locale>` URL contract, `Accept-Language`
//! negotiation, an ICU-subset message formatter, the translation policy that
//! refuses a translation whose English source has moved, and the [`t!`] macro
//! — English written where it renders, with the catalogue generated back out
//! of the code. Wasm-safe and zero-dep there; natively it carries `inventory`,
//! which is what turns `t!` sites into that catalogue. Reads the same
//! `messages/<locale>/*.json` as the TypeScript half, so a catalogue is
//! portable between them. See [`i18n`].
// The `cn!` fuse macro and styling data live in the Dioxus-free `ev_lib_classes`
// crate; re-export so the in-crate `crate::cn` path keeps resolving.
pub use cn;
// wasm-only: the module links wasm-bindgen/web-sys, which aren't deps on native.
// The `mfe!` macro is `#[macro_export]`ed from inside, so it too is wasm-only —
// the sole consumer (a producer cdylib) is always a wasm build.