pub struct EnginePlayStats {Show 16 fields
pub report_id: String,
pub game_id: Option<String>,
pub engine: String,
pub client_version: String,
pub platform: String,
pub format: Option<String>,
pub seats: u32,
pub multiplayer: bool,
pub duration_s: u32,
pub end_reason: String,
pub turnaround: EngineTurnaround,
pub engine_think: Option<EngineTurnaround>,
pub engine_think_same_turn: Option<EngineTurnaround>,
pub engine_think_cross_turn: Option<EngineTurnaround>,
pub think_samples_hidden: u32,
pub by_type: Vec<EngineTypeTurnaround>,
}Fields§
§report_id: StringGenerated by the client, so a retry cannot double-count the game.
game_id: Option<String>Which game these timings belong to: the relay’s game_id for a relay
game, and OfflinePlayGame::report_id for an offline one. Without it
a report is an orphan: the timings are there, but nothing says what was
played, who won, or how it ended.
It points at a record that names players. The report itself stays anonymous, and erasure reaches the record it points at by handle, so the id survives a scrub while what it leads to no longer names anyone.
engine: StringWhich engine actually ran, which is not always the one the room asked for: a browser with the Forge engine on hosts a “Manabrew” room on it.
client_version: String§platform: String§format: Option<String>§seats: u32§multiplayer: bool§duration_s: u32§end_reason: String§turnaround: EngineTurnaroundClient-side turnaround: answer sent to next prompt landing. This is the interval the player feels, and the one comparable across engines.
engine_think: Option<EngineTurnaround>The engine’s own think time, when it reports one.
engine_think_same_turn: Option<EngineTurnaround>engine_think split by whether an opponent turn happened inside the
window. A window is answer-received to next-prompt-ready, so in a game
against the AI the cross-turn half carries whole opponent turns and is
not a measure of one decision.
engine_think_cross_turn: Option<EngineTurnaround>Windows dropped because the tab was backgrounded for part of them: the engine times itself in wall clock, which keeps running while the worker is descheduled.
by_type: Vec<EngineTypeTurnaround>Implementations§
Source§impl EnginePlayStats
impl EnginePlayStats
Sourcepub fn is_plausible(&self) -> bool
pub fn is_plausible(&self) -> bool
Whether this is worth storing. Rejects the shapes a mistake or a hostile client produces: an unparseable id, empty or oversized text, a table with impossible seats, a report of no decisions at all.
Sourcepub fn linked_game_id(&self) -> Option<&str>
pub fn linked_game_id(&self) -> Option<&str>
The game this report belongs to, when the id is one a store can key on. A bad id costs the link, never the report: the timings are the point, and dropping a whole game over a malformed field is how telemetry ends up measuring nothing.
Trait Implementations§
Source§impl Clone for EnginePlayStats
impl Clone for EnginePlayStats
Source§fn clone(&self) -> EnginePlayStats
fn clone(&self) -> EnginePlayStats
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for EnginePlayStats
impl Debug for EnginePlayStats
Source§impl<'de> Deserialize<'de> for EnginePlayStats
impl<'de> Deserialize<'de> for EnginePlayStats
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
impl Eq for EnginePlayStats
Source§impl PartialEq for EnginePlayStats
impl PartialEq for EnginePlayStats
Source§impl Serialize for EnginePlayStats
impl Serialize for EnginePlayStats
impl StructuralPartialEq for EnginePlayStats
Source§impl TS for EnginePlayStats
impl TS for EnginePlayStats
Source§type WithoutGenerics = EnginePlayStats
type WithoutGenerics = EnginePlayStats
WithoutGenerics should just be Self.
If the type does have generic parameters, then all generic parameters must be replaced with
a dummy type, e.g ts_rs::Dummy or ().
The only requirement for these dummy types is that EXPORT_TO must be None. Read moreSource§fn decl_concrete() -> String
fn decl_concrete() -> String
TS::decl().
If this type is not generic, then this function is equivalent to TS::decl().Source§fn decl() -> String
fn decl() -> String
type User = { user_id: number, ... }.
This function will panic if the type has no declaration. Read moreSource§fn inline() -> String
fn inline() -> String
{ user_id: number }.
This function will panic if the type cannot be inlined.Source§fn inline_flattened() -> String
fn inline_flattened() -> String
This function will panic if the type cannot be flattened.
Source§fn visit_generics(v: &mut impl TypeVisitor)where
Self: 'static,
fn visit_generics(v: &mut impl TypeVisitor)where
Self: 'static,
Source§fn output_path() -> Option<&'static Path>
fn output_path() -> Option<&'static Path>
T should be exported.The returned path does not include the base directory from
TS_RS_EXPORT_DIR. Read moreSource§fn visit_dependencies(v: &mut impl TypeVisitor)where
Self: 'static,
fn visit_dependencies(v: &mut impl TypeVisitor)where
Self: 'static,
Source§const DOCS: Option<&'static str> = None
const DOCS: Option<&'static str> = None
TS is derived, docs are
automatically read from your doc comments or #[doc = ".."] attributesSource§fn dependencies() -> Vec<Dependency>where
Self: 'static,
fn dependencies() -> Vec<Dependency>where
Self: 'static,
Source§fn export() -> Result<(), ExportError>where
Self: 'static,
fn export() -> Result<(), ExportError>where
Self: 'static,
TS::export_all. Read moreSource§fn export_all() -> Result<(), ExportError>where
Self: 'static,
fn export_all() -> Result<(), ExportError>where
Self: 'static,
To export only this type, without its dependencies, use
TS::export. Read moreSource§fn export_all_to(out_dir: impl AsRef<Path>) -> Result<(), ExportError>where
Self: 'static,
fn export_all_to(out_dir: impl AsRef<Path>) -> Result<(), ExportError>where
Self: 'static,
To export only this type, without its dependencies, use
TS::export. Read more