Фон
Я разрабатываю менеджер баз данных через http-соединение в Rust. У базы данных есть стратегия истечения срока действия аутентификации, и мне нужно сохранить соединение в моем менеджере баз данных, повторно войдя в систему после истечения срока действия.
Псевдокод
Мой менеджер баз данных Database
, и есть несколько способов:
struct Database {
access_token: Option<String>
}
impl Database {
async fn login(&mut self, auth: Option<String>) {
if let Some(auth) = auth {
// If user provide auth, login with auth
let response = do_log_in(auth).await;
// get access_token from response
self.access_token = Some(response.access_token);
} else {
// If user doesn't provide auth, login with access_token
do_log_in(access_token).await;
}
restart_timer();
}
// restart the login timer
fn restart_timer(&mut self) {
self.cancel_timer();
self.do_start_timer();
}
}
Моя реализация
Я использую Tokio для реализации вещи restart_timer
:
- Сначала я добавляю поле
timer: Option<tokio::task::JoinHandle>
до Database
- Затем, когда вызывается
do_start_timer()
, используйте tokio::spawn
, чтобы создать новое задание и назначить дескриптор возвращающегося соединения для self.timer
. - Внутри закрытие
tokio::spawn
, я жду tokio::time::delay_for
, затем жду login
. - Чтобы отменить таймер, я просто назначаю
self.timer
с помощью None
, делая задачу отсоединенной.
Проблема
В подробном коде вышеописанной реализации есть сенсорная вещь:
self.timer = Some(tokio::spawn(async move {
tokio::time::delay_for(/* ... */).await;
self.login().await;
}));
Вышеупомянутый фрагмент находится в вещи do_start_timer
, но это не могу скомпилировать:
expected `&mut Database`
found `&mut Database`
but, the lifetime must be valid for the static
Я не знаю, что делать.