60 lines
1.3 KiB
Rust
60 lines
1.3 KiB
Rust
|
// edition:2021
|
||
|
// check-pass
|
||
|
|
||
|
use std::collections::HashMap;
|
||
|
use std::future::Future;
|
||
|
use std::pin::Pin;
|
||
|
|
||
|
pub struct GameMode {}
|
||
|
|
||
|
struct GameStateManager<'a> {
|
||
|
gamestate_stack: Vec<Box<dyn GameState<'a> + 'a>>,
|
||
|
}
|
||
|
|
||
|
pub trait GameState<'a> {}
|
||
|
|
||
|
async fn construct_gamestate_replay<'a>(
|
||
|
_gamemode: &GameMode,
|
||
|
_factory: &mut GameStateManager<'a>,
|
||
|
) -> Box<dyn GameState<'a> + 'a> {
|
||
|
unimplemented!()
|
||
|
}
|
||
|
|
||
|
type FutureGameState<'a, 'b> = Pin<Box<dyn Future<Output = Box<dyn GameState<'a> + 'a>> + 'b>>;
|
||
|
|
||
|
struct MenuOption<'a> {
|
||
|
command: Box<dyn for<'b> Fn(&'b mut GameStateManager<'a>) -> FutureGameState<'a, 'b> + 'a>,
|
||
|
}
|
||
|
|
||
|
impl<'a> MenuOption<'a> {
|
||
|
fn new(
|
||
|
_command: impl for<'b> Fn(&'b mut GameStateManager<'a>) -> FutureGameState<'a, 'b> + 'a,
|
||
|
) -> Self {
|
||
|
unimplemented!()
|
||
|
}
|
||
|
}
|
||
|
|
||
|
struct MenuState<'a> {
|
||
|
options: Vec<MenuOption<'a>>,
|
||
|
}
|
||
|
|
||
|
impl<'a> GameState<'a> for MenuState<'a> {}
|
||
|
|
||
|
pub async fn get_replay_menu<'a>(
|
||
|
gamemodes: &'a HashMap<&str, GameMode>,
|
||
|
) -> Box<dyn GameState<'a> + 'a> {
|
||
|
let recordings: Vec<String> = vec![];
|
||
|
let _ = recordings
|
||
|
.into_iter()
|
||
|
.map(|entry| {
|
||
|
MenuOption::new(move |f| {
|
||
|
Box::pin(construct_gamestate_replay(&gamemodes[entry.as_str()], f))
|
||
|
})
|
||
|
})
|
||
|
.collect::<Vec<_>>();
|
||
|
|
||
|
todo!()
|
||
|
}
|
||
|
|
||
|
fn main() {}
|