Compare commits

..

4 Commits

Author SHA1 Message Date
e88d64ff63 Bump to version 0.1.0 -> 0.2.0
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is passing
2022-10-18 09:39:54 +02:00
3ca6c43c9a Add additional routes for the future clients of SeaBattle 2022-10-18 09:34:26 +02:00
d4223be8b4 Improve test 2022-10-18 09:24:08 +02:00
83d0780954 Add a route to get default rules 2022-10-18 09:17:15 +02:00
7 changed files with 67 additions and 14 deletions

8
rust/Cargo.lock generated
View File

@@ -421,9 +421,9 @@ dependencies = [
[[package]]
name = "clap"
version = "4.0.15"
version = "4.0.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6bf8832993da70a4c6d13c581f4463c2bdda27b9bf1c5498dc4365543abe6d6f"
checksum = "2ef582e2c00a63a0c0aa1fb4a4870781c4f5729f51196d3537fa7c1c1992eaa3"
dependencies = [
"atty",
"bitflags",
@@ -1564,7 +1564,7 @@ dependencies = [
[[package]]
name = "sea_battle_backend"
version = "0.1.0"
version = "0.2.0"
dependencies = [
"actix",
"actix-cors",
@@ -1588,7 +1588,7 @@ dependencies = [
[[package]]
name = "sea_battle_cli_player"
version = "0.1.0"
version = "0.2.0"
dependencies = [
"clap",
"crossterm",

View File

@@ -1,6 +1,6 @@
[package]
name = "sea_battle_backend"
version = "0.1.0"
version = "0.2.0"
edition = "2021"
license = "GPL-2.0-or-later"
description = "A Sea Battle game backend server"
@@ -12,7 +12,7 @@ categories = [ "games" ]
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
clap = { version = "4.0.15", features = ["derive"] }
clap = { version = "4.0.16", features = ["derive"] }
log = "0.4.17"
env_logger = "0.9.0"
serde = { version = "1.0.145", features = ["derive"] }

View File

@@ -12,3 +12,14 @@ pub struct Args {
#[clap(short, long, value_parser)]
pub cors: Option<String>,
}
#[cfg(test)]
mod test {
use crate::args::Args;
#[test]
fn verify_cli() {
use clap::CommandFactory;
Args::command().debug_assert()
}
}

View File

@@ -361,7 +361,7 @@ impl BoatsLayout {
mod test {
use crate::data::boats_layout::{BoatDirection, BoatPosition, BoatsLayout, Coordinates};
use crate::data::game_map::GameMap;
use crate::data::{BotType, GameRules, PlayConfiguration, PrintableMap};
use crate::data::*;
#[test]
fn dist_coordinates_eq() {
@@ -488,9 +488,7 @@ mod test {
map_height: 5,
boats_str: "1,1".to_string(),
boats_can_touch: false,
player_continue_on_hit: false,
strike_timeout: None,
bot_type: BotType::Random,
..Default::default()
};
let mut boats = BoatsLayout(vec![

View File

@@ -4,7 +4,7 @@ use actix_web::{web, App, HttpRequest, HttpResponse, HttpServer, Responder};
use actix_web_actors::ws;
use crate::args::Args;
use crate::data::{GameRules, PlayConfiguration, VersionInfo};
use crate::data::{BoatsLayout, GameRules, PlayConfiguration, VersionInfo};
use crate::dispatcher_actor::DispatcherActor;
use crate::human_player_ws::{HumanPlayerWS, StartMode};
@@ -28,6 +28,35 @@ async fn game_configuration() -> impl Responder {
HttpResponse::Ok().json(PlayConfiguration::default())
}
/// Get default game rules
async fn default_game_rules() -> impl Responder {
HttpResponse::Ok().json(GameRules::random_players_rules())
}
/// Validate game rules
async fn validate_game_rules(rules: web::Json<GameRules>) -> impl Responder {
HttpResponse::Ok().json(rules.get_errors())
}
/// Generate random boats layout
async fn gen_boats_layout(rules: web::Json<GameRules>) -> impl Responder {
let errors = rules.get_errors();
if !errors.is_empty() {
return HttpResponse::BadRequest().json(errors);
}
match BoatsLayout::gen_random_for_rules(&rules) {
Ok(l) => HttpResponse::Ok().json(l),
Err(e) => {
log::error!(
"Failed to generate boats layout for valid game rules: {} ! / Rules: {:?}",
e,
rules
);
HttpResponse::InternalServerError().json("Failed to generate random layout!")
}
}
}
#[derive(serde::Serialize, serde::Deserialize, Eq, PartialEq, Debug)]
pub struct BotPlayQuery {
#[serde(flatten)]
@@ -135,6 +164,7 @@ async fn start_random(
log::info!("New random play");
resp
}
pub async fn start_server(args: Args) -> std::io::Result<()> {
log::info!("Start to listen on {}", args.listen_address);
@@ -155,6 +185,9 @@ pub async fn start_server(args: Args) -> std::io::Result<()> {
.wrap(cors)
.route("/version", web::get().to(version_information))
.route("/config", web::get().to(game_configuration))
.route("/game_rules/default", web::get().to(default_game_rules))
.route("/game_rules/validate", web::post().to(validate_game_rules))
.route("/generate_boats_layout", web::post().to(gen_boats_layout))
.route("/play/bot", web::get().to(start_bot_play))
.route("/play/create_invite", web::get().to(start_create_invite))
.route("/play/accept_invite", web::get().to(start_accept_invite))

View File

@@ -1,6 +1,6 @@
[package]
name = "sea_battle_cli_player"
version = "0.1.0"
version = "0.2.0"
edition = "2021"
license = "GPL-2.0-or-later"
description = "A Sea Battle game shell client"
@@ -12,8 +12,8 @@ categories = [ "games" ]
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
sea_battle_backend = { path = "../sea_battle_backend", version = "0.1.0" }
clap = { version = "4.0.15", features = ["derive"] }
sea_battle_backend = { path = "../sea_battle_backend", version = "0.2.0" }
clap = { version = "4.0.16", features = ["derive"] }
log = "0.4.17"
env_logger = "0.9.0"
tui = "0.19.0"

View File

@@ -61,3 +61,14 @@ lazy_static::lazy_static! {
pub fn cli_args() -> &'static CliArgs {
&ARGS
}
#[cfg(test)]
mod test {
use crate::cli_args::CliArgs;
#[test]
fn verify_cli() {
use clap::CommandFactory;
CliArgs::command().debug_assert()
}
}