use std::any::type_name;
use aoc_leaderboard::aoc::LeaderboardCredentials;
use chrono::{Datelike, Local};
use derive_builder::{Builder, UninitializedFieldError};
use serde::{Deserialize, Serialize};
use crate::leaderbot::Config;
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize, Builder)]
#[builder(
derive(Debug, PartialEq, Eq, Hash),
build_fn(name = "build_internal", error = "UninitializedFieldError", private)
)]
pub struct MemoryConfig {
#[builder(default = "Local::now().year()")]
pub year: i32,
pub leaderboard_id: u64,
#[builder(setter(into))]
pub credentials: LeaderboardCredentials,
}
impl MemoryConfig {
pub fn builder() -> MemoryConfigBuilder {
MemoryConfigBuilder::default()
}
pub fn new(year: i32, leaderboard_id: u64, credentials: LeaderboardCredentials) -> Self {
Self { year, leaderboard_id, credentials }
}
}
impl MemoryConfigBuilder {
pub fn view_key<S>(&mut self, view_key: S) -> &mut Self
where
S: Into<String>,
{
self.credentials = Some(LeaderboardCredentials::ViewKey(view_key.into()));
self
}
pub fn session_cookie<S>(&mut self, session_cookie: S) -> &mut Self
where
S: Into<String>,
{
self.credentials = Some(LeaderboardCredentials::SessionCookie(session_cookie.into()));
self
}
pub fn build(&self) -> crate::Result<MemoryConfig> {
match self.build_internal() {
Ok(config) => Ok(config),
Err(field_err) => Err(crate::Error::MissingField {
target: type_name::<MemoryConfig>(),
field: field_err.field_name(),
}),
}
}
}
impl Config for MemoryConfig {
#[cfg_attr(not(coverage), tracing::instrument(skip(self), level = "trace", ret))]
fn year(&self) -> i32 {
self.year
}
#[cfg_attr(not(coverage), tracing::instrument(skip(self), level = "trace", ret))]
fn leaderboard_id(&self) -> u64 {
self.leaderboard_id
}
#[cfg_attr(not(coverage), tracing::instrument(skip(self), level = "trace", ret))]
fn credentials(&self) -> LeaderboardCredentials {
self.credentials.clone()
}
}