//! pml-core: 基础类型与 Value 枚举
//!
//! PML 解释器与渲染器的共享基础：源码位置、符号、关键字、值类型。
//! 所有其他 crate 依赖此 crate 的类型定义。

#![doc(html_root_url = "https://docs.rs/libpml-core/0.1.0")]
#![warn(missing_docs)]

/// 源码位置与范围（用于错误报告）
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct Span {
    /// 字节起始偏移
    pub start: u32,
    /// 字节结束偏移（不含）
    pub end: u32,
    /// 起始行号（1-based）
    pub line: u32,
    /// 起始列号（1-based）
    pub column: u32,
}

impl Span {
    /// 构造一个 Span
    pub const fn new(start: u32, end: u32, line: u32, column: u32) -> Self {
        Self { start, end, line, column }
    }

    /// 合并两个 Span（用于多 token 表达式）
    pub fn merge(self, other: Self) -> Self {
        Self {
            start: self.start.min(other.start),
            end: self.end.max(other.end),
            line: self.line,
            column: self.column,
        }
    }
}

/// 符号字符串（interned 优化频繁比较）
pub type Symbol = std::rc::Rc<str>;

/// 关键字字符串（`:fill` 等带冒号前缀的符号）
pub type Keyword = std::rc::Rc<str>;

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn span_new_and_merge() {
        let a = Span::new(0, 5, 1, 1);
        let b = Span::new(10, 15, 1, 11);
        let m = a.merge(b);
        assert_eq!(m.start, 0);
        assert_eq!(m.end, 15);
    }
}
