konnektoren_core/game/
game_path.rs

1use crate::challenges::challenge_config::ChallengeConfig;
2use crate::game::Map;
3use serde::{Deserialize, Serialize};
4
5#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
6pub struct GamePath {
7    pub id: String,
8    pub name: String,
9    pub challenges: Vec<ChallengeConfig>,
10    pub map: Option<Map>,
11}
12
13impl Default for GamePath {
14    fn default() -> Self {
15        let data = include_str!("../../assets/konnektoren_path.yml");
16        serde_yaml::from_str(data).unwrap()
17    }
18}
19
20impl GamePath {
21    pub fn get_challenge_config(&self, challenge_config_id: &str) -> Option<&ChallengeConfig> {
22        self.challenges
23            .iter()
24            .find(|challenge| challenge.id == challenge_config_id)
25    }
26
27    pub fn challenge_ids(&self) -> Vec<String> {
28        self.challenges
29            .iter()
30            .map(|challenge| challenge.id.clone())
31            .collect()
32    }
33
34    pub fn next_challenge_id(&self, challenge_id: &str) -> Option<String> {
35        let mut iter = self.challenges.iter();
36        while let Some(challenge) = iter.next() {
37            if challenge.id == challenge_id {
38                return iter.next().map(|c| c.id.clone());
39            }
40        }
41        None
42    }
43}
44
45#[cfg(test)]
46mod tests {
47    use super::*;
48
49    #[test]
50    fn default_game_path() {
51        let game_path = GamePath::default();
52        assert_eq!(game_path.name, "Konnektoren");
53        assert!(!game_path.challenges.is_empty());
54    }
55
56    #[test]
57    fn get_challenge_config() {
58        let game_path = GamePath::default();
59        let challenge_config = game_path.get_challenge_config("unknown");
60        assert!(challenge_config.is_none());
61        let challenge_config = game_path.get_challenge_config("konnektoren-1");
62        assert!(challenge_config.is_some());
63    }
64
65    #[test]
66    fn test_challenge_ids() {
67        let game_path = GamePath::default();
68        let challenge_ids = game_path.challenge_ids();
69        assert_eq!(challenge_ids.len(), game_path.challenges.len());
70    }
71
72    #[test]
73    fn test_next_challenge_id() {
74        let game_path = GamePath::default();
75        let next_challenge_id = game_path.next_challenge_id("konnektoren-1");
76        assert_eq!(next_challenge_id, Some("konnektoren-2".to_string()));
77    }
78}