Improve WIP move-checking integration
This commit is contained in:
parent
a496b15710
commit
deedc1aee4
2 changed files with 77 additions and 5 deletions
63
src/wasm.rs
63
src/wasm.rs
|
@ -9,6 +9,19 @@ use crate::game::Game;
|
||||||
#[wasm_bindgen]
|
#[wasm_bindgen]
|
||||||
pub struct GameWasm(Game);
|
pub struct GameWasm(Game);
|
||||||
|
|
||||||
|
#[derive(Serialize, Deserialize, Tsify)]
|
||||||
|
#[tsify(from_wasm_abi)]
|
||||||
|
pub enum ResponseType {
|
||||||
|
OK,
|
||||||
|
ERR,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Serialize, Deserialize, Tsify)]
|
||||||
|
#[tsify(from_wasm_abi)]
|
||||||
|
pub struct MyResult<E> {
|
||||||
|
response_type: ResponseType,
|
||||||
|
value: E,
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Deserialize, Tsify, Copy, Clone)]
|
#[derive(Deserialize, Tsify, Copy, Clone)]
|
||||||
#[tsify(from_wasm_abi)]
|
#[tsify(from_wasm_abi)]
|
||||||
|
@ -70,11 +83,55 @@ impl GameWasm {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
board_instance.receive_play(played_letters)?;
|
match board_instance.receive_play(played_letters) {
|
||||||
|
Err(e) => {
|
||||||
|
return Ok(serde_wasm_bindgen::to_value(
|
||||||
|
&MyResult {
|
||||||
|
response_type: ResponseType::ERR,
|
||||||
|
value: e
|
||||||
|
}).unwrap());
|
||||||
|
},
|
||||||
|
Ok(_) => {}
|
||||||
|
}
|
||||||
|
|
||||||
let result = board_instance.calculate_scores(self.0.get_dictionary())?;
|
#[derive(Debug, Serialize, Deserialize, Tsify)]
|
||||||
|
#[tsify(from_wasm_abi)]
|
||||||
|
struct WordResult {
|
||||||
|
word: String,
|
||||||
|
score: u32,
|
||||||
|
}
|
||||||
|
|
||||||
Ok(serde_wasm_bindgen::to_value(&&result.1).unwrap())
|
let result = board_instance.calculate_scores(self.0.get_dictionary());
|
||||||
|
let result = match result {
|
||||||
|
Ok(x) => {
|
||||||
|
let words: Vec<WordResult> = x.0.iter()
|
||||||
|
.map(|(word, score)| {
|
||||||
|
WordResult {
|
||||||
|
word: word.to_string(),
|
||||||
|
score: *score
|
||||||
|
}
|
||||||
|
|
||||||
|
})
|
||||||
|
.collect();
|
||||||
|
//let total_score = x.1;
|
||||||
|
|
||||||
|
serde_wasm_bindgen::to_value(
|
||||||
|
&MyResult {
|
||||||
|
response_type: ResponseType::OK,
|
||||||
|
value: words
|
||||||
|
}).unwrap()
|
||||||
|
|
||||||
|
},
|
||||||
|
Err(e) => {
|
||||||
|
serde_wasm_bindgen::to_value(
|
||||||
|
&MyResult {
|
||||||
|
response_type: ResponseType::ERR,
|
||||||
|
value: e
|
||||||
|
}).unwrap()
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Ok(result)
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -1,5 +1,5 @@
|
||||||
import * as React from "react";
|
import * as React from "react";
|
||||||
import {GameWasm, Letter as LetterData, PlayedTile, Tray} from "word_grid";
|
import {GameWasm, Letter as LetterData, MyResult, PlayedTile, Tray, WordResult} from "word_grid";
|
||||||
import {createRoot} from "react-dom/client";
|
import {createRoot} from "react-dom/client";
|
||||||
import {Children, useMemo, useReducer, useState} from "react";
|
import {Children, useMemo, useReducer, useState} from "react";
|
||||||
|
|
||||||
|
@ -141,8 +141,23 @@ export function Game(props: {wasm: GameWasm}) {
|
||||||
return null;
|
return null;
|
||||||
});
|
});
|
||||||
|
|
||||||
const result = props.wasm.receive_play(playedTiles, false);
|
const result: MyResult<Array<WordResult> | string> = props.wasm.receive_play(playedTiles, false);
|
||||||
console.log({result});
|
console.log({result});
|
||||||
|
|
||||||
|
if(result.response_type === "ERR") {
|
||||||
|
alert(result.value);
|
||||||
|
} else {
|
||||||
|
|
||||||
|
let total_points = 0;
|
||||||
|
for (let word_result of (result.value as Array<WordResult>)) {
|
||||||
|
total_points += word_result.score;
|
||||||
|
}
|
||||||
|
|
||||||
|
alert(`You would score ${total_points} points.`);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}}>Check Submission</button>
|
}}>Check Submission</button>
|
||||||
</>;
|
</>;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue