Dzień dobry,
jako początkujący adept w rustcie, szukam pomocy, może ktoś wie, jak wybrnąć z tego scenariusza. Cel tej aplikacji jest wstępnie prosty, robimy nasłuch na notify z bazy postgresowej i jak tylko zejdzie powiadomienie, to na koniec chciałbym zrobić jakiś update/insert na bazie. Na razie, bazując na ściągawce,naklepałem tylko tyle:
#[tokio::main]
async fn main() {
let (client, mut connection) = tokio_postgres::connect("host=localhost user=postgres dbname=postgres password=password",NoTls).await.unwrap();
let (tx, rx) = futures_channel::mpsc::unbounded();
let stream =
stream::poll_fn(move |cx| connection.poll_message(cx)).map_err(|e| panic!("{}", e));
let connection = stream.forward(tx).map(|r| r.unwrap());
tokio::spawn(connection);
client
.batch_execute(
"LISTEN test_notifications;"
)
.await
.unwrap();
let notifications = rx
.filter_map(|m| {
match m {
AsyncMessage::Notification(n) =>{
println!("Match: {:?}",n);
// tutaj próbuje wcisnąć cały tzw. "proces biznesowy" i wszystko jest ok, dopóki nie muszę tych wyników zapisać na bazie danych
futures_util::future::ready(Some(n))
},
_ => futures_util::future::ready(None),
}})
.collect::<Vec<_>>()
.await;
}
Z samym crudem nie mam problemów, żeby sobie dłubać, ale niestety odbijam się od takiej rzeczy, że jak już wpadłem w ten "async", to nie mogę z niego wyjść, próba przerobienia tego filter_mapa na asynchroniczny kończyła się tym, że pierwszy sygnał był odebrany i w zasadzie dalej już się nic nie działo, bo pewnie coś przeoczyłem, co jest istotne.
Także za wszelkie code review i sugestie, podpowiedzi z góry dziękuje.