86 lines
2.5 KiB
Rust
86 lines
2.5 KiB
Rust
use crate::{
|
|
api::GameId,
|
|
ui::{Action, GamePreviewElement},
|
|
};
|
|
use serde::{Deserialize, Serialize};
|
|
use sgf::go::Game;
|
|
use typeshare::typeshare;
|
|
|
|
fn rank_strings() -> Vec<String> {
|
|
vec![
|
|
"", "30 kyu", "29 kyu", "28 kyu", "27 kyu", "26 kyu", "25 kyu", "24 kyu", "23 kyu",
|
|
"22 kyu", "21 kyu", "20 kyu", "19 kyu", "18 kyu", "17 kyu", "16 kyu", "15 kyu", "14 kyu",
|
|
"13 kyu", "12 kyu", "11 kyu", "10 kyu", "9 kyu", "8 kyu", "7 kyu", "6 kyu", "5 kyu",
|
|
"4 kyu", "3 kyu", "2 kyu", "1 kyu", "1 dan", "2 dan", "3 dan", "4 dan", "5 dan", "6 dan",
|
|
"7 dan", "8 dan", "9 dan", "1 pro", "2 pro", "3 pro", "4 pro", "5 pro", "6 pro", "7 pro",
|
|
"8 pro", "9 pro",
|
|
]
|
|
.into_iter()
|
|
.map(|s| s.to_owned())
|
|
.collect()
|
|
}
|
|
|
|
#[derive(Clone, Debug, Serialize, Deserialize)]
|
|
#[typeshare]
|
|
pub enum PlayerElement {
|
|
Hotseat(HotseatPlayerElement),
|
|
// Remote(RemotePlayerElement),
|
|
// Bot(BotPlayerElement),
|
|
}
|
|
|
|
impl Default for PlayerElement {
|
|
fn default() -> PlayerElement {
|
|
PlayerElement::Hotseat(HotseatPlayerElement::default())
|
|
}
|
|
}
|
|
|
|
#[derive(Clone, Debug, Serialize, Deserialize, Default)]
|
|
#[typeshare]
|
|
pub struct HotseatPlayerElement {
|
|
pub placeholder: Option<String>,
|
|
pub default_rank: Option<String>,
|
|
pub ranks: Vec<String>,
|
|
}
|
|
|
|
#[derive(Clone, Debug, Serialize, Deserialize)]
|
|
#[typeshare]
|
|
pub struct RemotePlayerElement {}
|
|
|
|
#[derive(Clone, Debug, Serialize, Deserialize)]
|
|
#[typeshare]
|
|
pub struct BotPlayerElement {}
|
|
|
|
#[derive(Clone, Debug, Serialize, Deserialize)]
|
|
#[typeshare]
|
|
pub struct HomeView {
|
|
pub black_player: PlayerElement,
|
|
pub white_player: PlayerElement,
|
|
pub games: Vec<GamePreviewElement>,
|
|
pub start_game: Action<()>,
|
|
}
|
|
|
|
pub fn home<'a>(games: impl Iterator<Item = (&'a GameId, &'a Game)>) -> HomeView {
|
|
let black_player = PlayerElement::Hotseat(HotseatPlayerElement {
|
|
placeholder: Some("black player".to_owned()),
|
|
default_rank: None,
|
|
ranks: rank_strings(),
|
|
});
|
|
let white_player = PlayerElement::Hotseat(HotseatPlayerElement {
|
|
placeholder: Some("white player".to_owned()),
|
|
default_rank: None,
|
|
ranks: rank_strings(),
|
|
});
|
|
HomeView {
|
|
black_player,
|
|
white_player,
|
|
games: games
|
|
.map(|(id, game)| GamePreviewElement::new(id, game))
|
|
.collect(),
|
|
start_game: Action {
|
|
id: "start-game-action".to_owned(),
|
|
label: "New Game".to_owned(),
|
|
action: (),
|
|
},
|
|
}
|
|
}
|