use serde::Serialize;
#[derive(Debug, Clone, Default, Serialize)]
pub struct GameExportOptions {
#[serde(skip_serializing_if = "Option::is_none")]
moves: Option<bool>,
#[serde(rename = "pgnInJson", skip_serializing_if = "Option::is_none")]
pgn_in_json: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
tags: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
clocks: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
evals: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
accuracy: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
opening: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
division: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
literate: Option<bool>,
}
impl GameExportOptions {
#[must_use]
pub fn moves(mut self, include: bool) -> Self {
self.moves = Some(include);
self
}
#[must_use]
pub fn pgn_in_json(mut self, include: bool) -> Self {
self.pgn_in_json = Some(include);
self
}
#[must_use]
pub fn tags(mut self, include: bool) -> Self {
self.tags = Some(include);
self
}
#[must_use]
pub fn clocks(mut self, include: bool) -> Self {
self.clocks = Some(include);
self
}
#[must_use]
pub fn evals(mut self, include: bool) -> Self {
self.evals = Some(include);
self
}
#[must_use]
pub fn accuracy(mut self, include: bool) -> Self {
self.accuracy = Some(include);
self
}
#[must_use]
pub fn opening(mut self, include: bool) -> Self {
self.opening = Some(include);
self
}
#[must_use]
pub fn division(mut self, include: bool) -> Self {
self.division = Some(include);
self
}
#[must_use]
pub fn literate(mut self, include: bool) -> Self {
self.literate = Some(include);
self
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn default_serializes_to_nothing() {
let query = serde_urlencoded::to_string(GameExportOptions::default()).unwrap();
assert_eq!(query, "");
}
#[test]
fn set_flags_use_their_wire_names() {
let options = GameExportOptions::default()
.moves(true)
.pgn_in_json(true)
.clocks(false)
.division(true);
let query = serde_urlencoded::to_string(&options).unwrap();
assert_eq!(
query,
"moves=true&pgnInJson=true&clocks=false&division=true"
);
}
#[test]
fn unset_flags_are_omitted() {
let query = serde_urlencoded::to_string(GameExportOptions::default().evals(true)).unwrap();
assert_eq!(query, "evals=true");
}
}