use std::path::Path;
use orrery_core::interner::{self, Symbol};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct FileId(Symbol);
impl FileId {
pub fn new(path: &Path) -> Self {
let path_str = path.to_str().expect("file paths must be valid UTF-8");
Self(interner::get_or_intern(path_str))
}
pub fn as_str(self) -> &'static str {
interner::resolve(self.0)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn new_returns_distinct_ids() {
let a = FileId::new(Path::new("a.orr"));
let b = FileId::new(Path::new("b.orr"));
let c = FileId::new(Path::new("c.orr"));
assert_ne!(a, b);
assert_ne!(b, c);
assert_ne!(a, c);
}
#[test]
fn new_deduplicates_same_path() {
let first = FileId::new(Path::new("shared/styles.orr"));
let second = FileId::new(Path::new("shared/styles.orr"));
assert_eq!(first, second);
}
#[test]
fn as_str_returns_original_path() {
let id = FileId::new(Path::new("shared/styles.orr"));
assert_eq!(id.as_str(), "shared/styles.orr");
}
}