У меня есть значение, которое не может быть вычислено во время компиляции. Его необходимо вычислить до запуска любого кода приложения, а затем он будет считан только в течение всего жизненного цикла приложения. Его также необходимо передать исполнителям, таким как обработчики tokio
и hyper
.
Как создать безопасное, идиоматически и без лишних потерь производительности такое значение?
- Если я создам его в
main
и передам его hyper
, он не проживет достаточно долго. - Если я создам его с
lazy_static!
, он вычисляется только при первом обращении к нему. Если он не может быть вычислен, то я не хочу запускать и остальную часть приложения. Я предпочел бы знать, что не могу подключиться к базе данных при запуске приложения, а не когда клиент делает запрос. - Если я сделаю это
static mut
, то я не смогу использовать его в код безопасности.
В идеале я хотел бы сделать что-то вроде:
#[tokio::main]
pub async fn main() {
let db = init_db();
// This uses a hyper server, passes db around
// to tokio and hyper handlers, etc.
run_app(&db);
}