dendi/src/lib.rs

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