use serde::{Deserialize, Serialize};
use std::fmt;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum Galaxy {
Aria,
Citta,
Codex,
Journals,
Dreams,
Research,
Sessions,
Substrate,
Tutorial,
Universal,
Karma,
Dharma,
Associations,
Embeddings,
Valkyrie,
}
impl Galaxy {
pub const COUNT: usize = 15;
#[must_use]
pub const fn all() -> [Self; 15] {
[
Self::Aria,
Self::Citta,
Self::Codex,
Self::Journals,
Self::Dreams,
Self::Research,
Self::Sessions,
Self::Substrate,
Self::Tutorial,
Self::Universal,
Self::Karma,
Self::Dharma,
Self::Associations,
Self::Embeddings,
Self::Valkyrie,
]
}
#[must_use]
pub const fn memory_galaxies() -> [Self; 11] {
[
Self::Aria,
Self::Citta,
Self::Codex,
Self::Journals,
Self::Dreams,
Self::Research,
Self::Sessions,
Self::Substrate,
Self::Tutorial,
Self::Universal,
Self::Valkyrie,
]
}
#[must_use]
pub const fn db_name(self) -> &'static str {
match self {
Self::Aria => "aria",
Self::Citta => "citta",
Self::Codex => "codex",
Self::Journals => "journals",
Self::Dreams => "dreams",
Self::Research => "research",
Self::Sessions => "sessions",
Self::Substrate => "substrate",
Self::Tutorial => "tutorial",
Self::Universal => "universal",
Self::Karma => "karma",
Self::Dharma => "dharma",
Self::Associations => "associations",
Self::Embeddings => "embeddings",
Self::Valkyrie => "valkyrie",
}
}
#[must_use]
pub const fn description(self) -> &'static str {
match self {
Self::Aria => "Artistic/creative memories",
Self::Citta => "Consciousness stream",
Self::Codex => "Knowledge/documents",
Self::Journals => "Session journals",
Self::Dreams => "Dream cycle outputs",
Self::Research => "Research notes",
Self::Sessions => "Session recordings",
Self::Substrate => "System state/config",
Self::Tutorial => "Tutorial memories",
Self::Universal => "Cross-galaxy index",
Self::Karma => "Karma ledger",
Self::Dharma => "Governance rules",
Self::Associations => "Cross-memory links",
Self::Embeddings => "Vector embeddings",
Self::Valkyrie => "Valkyrie sanctuary/reflections",
}
}
#[must_use]
pub fn from_db_name(name: &str) -> Option<Self> {
Self::all().into_iter().find(|g| g.db_name() == name)
}
}
impl fmt::Display for Galaxy {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", self.db_name())
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn galaxy_count_is_15() {
assert_eq!(Galaxy::COUNT, 15);
assert_eq!(Galaxy::all().len(), 15);
}
#[test]
fn galaxy_db_names_unique() {
let names: Vec<_> = Galaxy::all().iter().map(|g| g.db_name()).collect();
let unique: std::collections::HashSet<_> = names.iter().collect();
assert_eq!(names.len(), unique.len());
}
#[test]
fn memory_galaxies_excludes_special_purpose() {
let mg = Galaxy::memory_galaxies();
assert_eq!(mg.len(), 11);
assert!(!mg.contains(&Galaxy::Karma));
assert!(!mg.contains(&Galaxy::Dharma));
assert!(!mg.contains(&Galaxy::Associations));
assert!(!mg.contains(&Galaxy::Embeddings));
assert!(mg.contains(&Galaxy::Valkyrie));
}
}