DEVELOPMENT ENVIRONMENT

~liljamo/deck-builder

ref: 11a6eebf7245d5b4c62b57a9978dfb9aa43778bb deck-builder/client/src/plugins/async_tasks/parse_game_status.rs -rw-r--r-- 1.6 KiB
11a6eebfJonni Liljamo feat(client): game ui plugin, ui -> details_ui 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
50
51
52
53
54
55
56
57
58
59
/*
 * 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::{
    plugins::game::GameData, game_status::GameStatus, api::game::Game,
};

use bevy::{prelude::*, tasks::{Task, AsyncComputeTaskPool}};
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 {
            let res = GameStatus::new(&ev.game);

            res
        });
        commands.spawn(ParseGameStatus(task));
    }
}

pub fn handle_call(
    mut commands: Commands,
    mut tasks: Query<(Entity, &mut ParseGameStatus)>,
    mut game_data: ResMut<GameData>,
   ) {
    match tasks.get_single_mut() {
        Ok((entity, mut task)) => {
            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();
            }
        }
        // NOTE: don't do anything if the wanted thingy doesn't exist
        _ => {}
    }
}