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
use Debug;
/// Extractor marker type.
///
/// Since the [`Tx`](crate::Tx) extractor operates at the type level, a generic type parameter is
/// used to identify different databases.
///
/// There is a blanket implementation for all implementors of [`sqlx::Database`], but you can create
/// your own types if you need to work with multiple databases.
///
/// ```
/// // Marker struct "database 1"
/// #[derive(Debug)]
/// struct Db1;
///
/// impl axum_sqlx_tx::Marker for Db1 {
/// type Driver = sqlx::Sqlite;
/// }
///
/// // Marker struct "database 2"
/// #[derive(Debug)]
/// struct Db2;
///
/// impl axum_sqlx_tx::Marker for Db2 {
/// type Driver = sqlx::Sqlite;
/// }
///
/// // You'll also need a "state" structure that implements `FromRef` for each `State<DB>`
/// #[derive(Clone)]
/// struct MyState {
/// state1: axum_sqlx_tx::State<Db1>,
/// state2: axum_sqlx_tx::State<Db2>,
/// }
///
/// impl axum::extract::FromRef<MyState> for axum_sqlx_tx::State<Db1> {
/// fn from_ref(state: &MyState) -> Self {
/// state.state1.clone()
/// }
/// }
///
/// impl axum::extract::FromRef<MyState> for axum_sqlx_tx::State<Db2> {
/// fn from_ref(state: &MyState) -> Self {
/// state.state2.clone()
/// }
/// }
///
/// // The extractor can then be aliased for each DB
/// type Tx1 = axum_sqlx_tx::Tx<Db1>;
/// type Tx2 = axum_sqlx_tx::Tx<Db2>;
///
/// # async fn foo() {
/// // Setup each extractor
/// let pool1 = sqlx::SqlitePool::connect("...").await.unwrap();
/// let (state1, layer1) = Tx1::setup(pool1);
///
/// let pool2 = sqlx::SqlitePool::connect("...").await.unwrap();
/// let (state2, layer2) = Tx2::setup(pool2);
///
/// let app = axum::Router::new()
/// .route("/", axum::routing::get(|tx1: Tx1, tx2: Tx2| async move {
/// /* ... */
/// }))
/// .layer(layer1)
/// .layer(layer2)
/// .with_state(MyState { state1, state2 });
/// # let listener: tokio::net::TcpListener = todo!();
/// # axum::serve(listener, app);
/// # }
/// ```