expr_solver/symbol/
mod.rs1use crate::number::Number;
12use std::borrow::Cow;
13use thiserror::Error;
14
15#[cfg(feature = "decimal-precision")]
17mod decimal;
18#[cfg(feature = "f64-floats")]
19mod f64;
20
21#[derive(Error, Debug, Clone)]
23pub enum FuncError {
24 #[error("Conversion error: failed to convert number to f64")]
25 ToF64Conversion,
26 #[error("Conversion error: failed to convert f64 result back to number")]
27 FromF64Conversion,
28 #[error("Square root of negative number: {value}")]
29 NegativeSqrt { value: Number },
30 #[error("Domain error in function '{function}': invalid input {input}")]
31 DomainError { function: String, input: Number },
32 #[error("Math error: {message}")]
33 MathError { message: String },
34}
35
36#[derive(Error, Debug, Clone, PartialEq, Eq)]
38pub enum SymbolError {
39 #[error("Duplicate symbol definition: '{0}'")]
41 DuplicateSymbol(String),
42
43 #[error("Symbol '{0}' not found")]
45 SymbolNotFound(String),
46}
47
48#[derive(Debug, Clone)]
52pub enum Symbol {
53 Const {
55 name: Cow<'static, str>,
56 value: Number,
57 description: Option<Cow<'static, str>>,
58 local: bool,
60 },
61 Func {
63 name: Cow<'static, str>,
64 args: usize,
66 variadic: bool,
68 callback: fn(&[Number]) -> Result<Number, FuncError>,
69 description: Option<Cow<'static, str>>,
70 local: bool,
72 },
73}
74
75impl Symbol {
76 pub fn name(&self) -> &str {
78 match self {
79 Symbol::Const { name, .. } => name,
80 Symbol::Func { name, .. } => name,
81 }
82 }
83
84 pub fn description(&self) -> Option<&str> {
86 match self {
87 Symbol::Const { description, .. } => description.as_deref(),
88 Symbol::Func { description, .. } => description.as_deref(),
89 }
90 }
91
92 pub fn is_local(&self) -> bool {
94 match self {
95 Symbol::Const { local, .. } => *local,
96 Symbol::Func { local, .. } => *local,
97 }
98 }
99}