DEVELOPMENT ENVIRONMENT

~liljamo/deck-builder

ref: de6cc1598b1f22b6bdf0e9f06e0753d0265f901f deck-builder/client/src/plugins/async_tasks/parse_game_status.rs -rw-r--r-- 1.4 KiB
de6cc159 — skye feat(client): take cards from supply piles 1 year, 7 months ago
                                                                                
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
/*
 * This file is part of laurelin_client
 * Copyright (C) 2023 Jonni Liljamo <jonni@liljamo.com>
 *
 * Licensed under GPL-3.0-only.
 * See LICENSE for licensing information.
 */

use crate::{api::game::Game, game_status::GameStatus, plugins::game::GameData};

use bevy::{
    prelude::*,
    tasks::{AsyncComputeTaskPool, Task},
};
use futures_lite::future;

#[derive(Component)]
pub struct ParseGameStatus(Task<GameStatus>);

#[derive(Clone)]
pub struct ParseGameStatusEvent {
    pub game: Game,
}

pub fn start_call(mut commands: Commands, mut start_ev_r: EventReader<ParseGameStatusEvent>) {
    for ev in start_ev_r.iter() {
        let thread_pool = AsyncComputeTaskPool::get();
        let ev = ev.clone();
        let task = thread_pool.spawn(async move { GameStatus::new(&ev.game) });
        commands.spawn(ParseGameStatus(task));
    }
}

pub fn handle_call(
    mut commands: Commands,
    mut tasks: Query<(Entity, &mut ParseGameStatus)>,
    mut game_data: ResMut<GameData>,
) {
    if let Ok((entity, mut task)) = tasks.get_single_mut() {
        if let Some(response) = future::block_on(future::poll_once(&mut task.0)) {
            game_data.game_status = Some(response);
            game_data.parsing_data = false;

            // remove the task
            commands.entity(entity).remove::<ParseGameStatus>();
            commands.entity(entity).despawn_recursive();
        }
    }
}