60 lines
1.4 KiB
Rust
60 lines
1.4 KiB
Rust
// ~/~ begin <<dendi.md#lib.rs>>[init]
|
|
use ndm::RollSet;
|
|
use std::str::FromStr;
|
|
|
|
// ~/~ begin <<dendi.md#sheetentry>>[init]
|
|
#[derive(Debug, PartialEq, Clone)]
|
|
struct SheetEntry {
|
|
description: String,
|
|
display_name: String,
|
|
unique_name: String,
|
|
value: EntryValue,
|
|
value_text: Option<String>,
|
|
}
|
|
// ~/~ end
|
|
// ~/~ begin <<dendi.md#sheetentry-methods>>[init]
|
|
impl SheetEntry {
|
|
fn evaluate(&self) -> Result<String, EntryValueError> {
|
|
match &self.value {
|
|
EntryValue::Num(n) => Ok(n.to_string()),
|
|
EntryValue::Roll(r) => Ok(r.to_string()),
|
|
EntryValue::None => Err(EntryValueError::NoValue(self.clone())),
|
|
_ => todo!(),
|
|
}
|
|
}
|
|
}
|
|
// ~/~ end
|
|
// ~/~ begin <<dendi.md#entryvalue>>[init]
|
|
#[derive(Debug, PartialEq, Clone)]
|
|
enum EntryValue {
|
|
Num(i32),
|
|
Roll(RollSet),
|
|
CalculateMe,
|
|
None,
|
|
}
|
|
// ~/~ end
|
|
// ~/~ begin <<dendi.md#entryvalue-fromstr>>[init]
|
|
#[derive(Debug, PartialEq)]
|
|
enum EntryValueError {
|
|
NoValue(SheetEntry),
|
|
InvalidFormula(String),
|
|
}
|
|
|
|
impl FromStr for EntryValue {
|
|
type Err = EntryValueError;
|
|
fn from_str(s: &str) -> Result<Self, Self::Err> {
|
|
if s.is_empty() {
|
|
Ok(Self::None)
|
|
} else if let Ok(n) = s.parse::<i32>() {
|
|
Ok(Self::Num(n))
|
|
} else if let Ok(rs) = s.parse::<RollSet>() {
|
|
Ok(Self::Roll(rs))
|
|
} else {
|
|
Ok(Self::CalculateMe)
|
|
}
|
|
}
|
|
}
|
|
// ~/~ end
|
|
// ~/~ end
|
|
|