cards/src/main.rs

101 lines
2.7 KiB
Rust
Raw Normal View History

2024-04-27 18:22:35 -04:00
use std::fs::{read, read_to_string};
use std::{error::Error, fs, result::Result};
use warp::Filter;
2024-04-13 21:04:42 -04:00
#[allow(non_snake_case)]
pub mod CAHd_game;
use crate::CAHd_game::*;
2024-04-05 22:38:41 -04:00
2024-04-27 18:22:35 -04:00
pub mod api;
use crate::api::*;
2024-04-06 22:38:00 -04:00
/// Parse json for card data
2024-04-27 01:03:20 -04:00
fn load_json(path: &str) -> Result<Vec<CAHCardSet>, Box<dyn Error>> {
2024-04-05 22:38:41 -04:00
let data: String = fs::read_to_string(path).expect("Error reading file");
let jayson: Vec<CAHCardSet> = serde_json::from_str(&data)?;
Ok(jayson)
}
2024-04-27 01:03:20 -04:00
fn test() -> Result<(), Box<dyn Error>> {
2024-04-06 22:38:00 -04:00
// choose decks
2024-04-05 22:38:41 -04:00
let cards_input_path: &str = "data/cah-cards-full.json";
2024-04-12 18:23:33 -04:00
// TODO: this should be a master card database and pointers
// to the cards should be passed to the game instead of actual cards
2024-04-12 02:04:58 -04:00
let chosen_packs: Vec<CAHCardSet> = load_json(cards_input_path)?;
2024-04-12 18:23:33 -04:00
println!("{}", &chosen_packs.len());
2024-04-05 22:38:41 -04:00
2024-04-12 02:04:58 -04:00
let test_player0 = CAHPlayer {
2024-04-12 18:35:13 -04:00
player_name: "Adam".to_string(),
role: PlayerRole::Host,
white: vec![],
black: vec![],
};
2024-04-12 02:04:58 -04:00
let test_player1 = CAHPlayer {
2024-04-12 18:35:13 -04:00
player_name: "Ferris".to_string(),
role: PlayerRole::Player,
white: vec![],
black: vec![],
};
2024-04-12 02:04:58 -04:00
// make some games
2024-04-12 18:23:33 -04:00
// use hashmap?
2024-04-12 02:04:58 -04:00
let mut games: Vec<CAHGame> = vec![];
// create game with/for player 0
2024-04-12 18:35:13 -04:00
let test_game0 = NewGameRequest {
name: "Test0".to_string(),
host: test_player0,
packs: chosen_packs,
};
2024-04-13 21:04:42 -04:00
games.push(CAHGame::new(test_game0)?);
2024-04-12 02:04:58 -04:00
2024-04-12 18:23:33 -04:00
// a new game request struct but this player is a player
games[0].create_player(test_player1)?;
2024-04-10 04:18:31 -04:00
2024-04-12 02:35:35 -04:00
// start round
2024-04-12 18:23:33 -04:00
games[0].game_start()?;
2024-04-13 21:04:42 -04:00
2024-04-24 02:24:10 -04:00
println!("----------------------");
for card in &games[0].players[0].white {
println!("{}", card.text);
2024-04-27 01:03:20 -04:00
}
Ok(())
}
2024-04-27 02:34:28 -04:00
#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
pretty_env_logger::init();
test()?;
2024-04-27 01:03:20 -04:00
2024-04-27 02:34:28 -04:00
// Keep track of all connected users, key is usize, value
// is a websocket sender.
2024-04-27 18:22:35 -04:00
let users = api::Users::default();
2024-04-27 02:34:28 -04:00
// Turn our "state" into a new Filter...
let users = warp::any().map(move || users.clone());
2024-04-27 01:03:20 -04:00
2024-04-27 02:34:28 -04:00
// GET /chat -> websocket upgrade
let chat = warp::path("chat")
// The `ws()` filter will prepare Websocket handshake...
.and(warp::ws())
.and(users)
.map(|ws: warp::ws::Ws, users| {
// This will call our function if the handshake succeeds.
2024-04-27 18:22:35 -04:00
ws.on_upgrade(move |socket| on_user_connected(socket, users))
2024-04-27 02:34:28 -04:00
});
2024-04-27 01:03:20 -04:00
2024-04-27 02:34:28 -04:00
// GET / -> index html
2024-04-27 18:22:35 -04:00
let index = warp::get()
.and(warp::path::end())
.and(warp::fs::file("./test_client.html"));
2024-04-27 01:03:20 -04:00
2024-04-27 02:34:28 -04:00
let routes = index.or(chat);
2024-04-27 01:03:20 -04:00
2024-04-27 18:22:35 -04:00
warp::serve(routes).run(([0, 0, 0, 0], 3030)).await;
2024-04-27 01:03:20 -04:00
2024-04-27 02:34:28 -04:00
Ok(())
}