Fix serialization issues

This commit is contained in:
Austen Adler 2021-05-12 23:04:54 -04:00
parent fbf6ecc9d4
commit 4d1badc36b
3 changed files with 22 additions and 21 deletions

View File

@ -262,28 +262,28 @@ impl Calculator {
'r' => self.angle_mode = CalculatorAngleMode::Radians, 'r' => self.angle_mode = CalculatorAngleMode::Radians,
'g' => self.angle_mode = CalculatorAngleMode::Grads, 'g' => self.angle_mode = CalculatorAngleMode::Grads,
'_' => self.display_mode = CalculatorDisplayMode::Default, '_' => self.display_mode = CalculatorDisplayMode::Default,
',' => self.display_mode = CalculatorDisplayMode::Separated(','), ',' => self.display_mode = CalculatorDisplayMode::Separated{separator: ','},
' ' => self.display_mode = CalculatorDisplayMode::Separated(' '), ' ' => self.display_mode = CalculatorDisplayMode::Separated{separator: ' '},
's' => self.display_mode = CalculatorDisplayMode::Scientific(DEFAULT_PRECISION), 's' => self.display_mode = CalculatorDisplayMode::Scientific{precision: DEFAULT_PRECISION},
'S' => { 'S' => {
let precision = self.checked_get(0)? as usize; let precision = self.checked_get(0)? as usize;
if precision > MAX_PRECISION { if precision > MAX_PRECISION {
return Err(CalculatorError::PrecisionTooHigh); return Err(CalculatorError::PrecisionTooHigh);
} }
self.display_mode = CalculatorDisplayMode::Scientific(self.pop_usize()?) self.display_mode = CalculatorDisplayMode::Scientific{precision: self.pop_usize()?}
} }
'e' => { 'e' => {
self.display_mode = CalculatorDisplayMode::Engineering(DEFAULT_PRECISION) self.display_mode = CalculatorDisplayMode::Engineering{precision: DEFAULT_PRECISION}
} }
'E' => { 'E' => {
let precision = self.checked_get(0)? as usize; let precision = self.checked_get(0)? as usize;
if precision > MAX_PRECISION { if precision > MAX_PRECISION {
return Err(CalculatorError::PrecisionTooHigh); return Err(CalculatorError::PrecisionTooHigh);
} }
self.display_mode = CalculatorDisplayMode::Engineering(self.pop_usize()?) self.display_mode = CalculatorDisplayMode::Engineering{precision: self.pop_usize()?}
} }
'f' => self.display_mode = CalculatorDisplayMode::Fixed(DEFAULT_PRECISION), 'f' => self.display_mode = CalculatorDisplayMode::Fixed{precision: DEFAULT_PRECISION},
'F' => self.display_mode = CalculatorDisplayMode::Fixed(self.pop_usize()?), 'F' => self.display_mode = CalculatorDisplayMode::Fixed{precision: self.pop_usize()?},
_ => return Err(CalculatorError::NoSuchSetting(c)), _ => return Err(CalculatorError::NoSuchSetting(c)),
}; };
self.state = CalculatorState::Normal; self.state = CalculatorState::Normal;

View File

@ -73,22 +73,23 @@ impl fmt::Display for CalculatorAngleMode {
#[derive(Clone, Debug, Serialize, Deserialize)] #[derive(Clone, Debug, Serialize, Deserialize)]
#[serde(tag = "display_mode")] #[serde(tag = "display_mode")]
// Could also have added content="precision"
pub enum CalculatorDisplayMode { pub enum CalculatorDisplayMode {
Default, Default,
Separated(char), Separated { separator: char },
Scientific(usize), Scientific { precision: usize },
Engineering(usize), Engineering { precision: usize },
Fixed(usize), Fixed { precision: usize },
} }
impl fmt::Display for CalculatorDisplayMode { impl fmt::Display for CalculatorDisplayMode {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self { match self {
CalculatorDisplayMode::Default => write!(f, "DEF"), CalculatorDisplayMode::Default => write!(f, "DEF"),
CalculatorDisplayMode::Separated(c) => write!(f, "SEP({})", c), CalculatorDisplayMode::Separated{separator} => write!(f, "SEP({})", separator),
CalculatorDisplayMode::Scientific(p) => write!(f, "SCI({})", p), CalculatorDisplayMode::Scientific{precision} => write!(f, "SCI({})", precision),
CalculatorDisplayMode::Engineering(p) => write!(f, "ENG({})", p), CalculatorDisplayMode::Engineering{precision} => write!(f, "ENG({})", precision),
CalculatorDisplayMode::Fixed(p) => write!(f, "FIX({})", p), CalculatorDisplayMode::Fixed{precision} => write!(f, "FIX({})", precision),
} }
} }
} }

View File

@ -119,16 +119,16 @@ fn main() -> Result<(), Box<dyn Error>> {
let content = vec![Spans::from(Span::raw( let content = vec![Spans::from(Span::raw(
match app.calculator.get_display_mode() { match app.calculator.get_display_mode() {
CalculatorDisplayMode::Default => format!("{:>2}: {}", i, *m), CalculatorDisplayMode::Default => format!("{:>2}: {}", i, *m),
CalculatorDisplayMode::Separated(c) => { CalculatorDisplayMode::Separated{separator} => {
format!("{:>2}: {}", i, fmt_separated(*m, *c)) format!("{:>2}: {}", i, fmt_separated(*m, *separator))
} }
CalculatorDisplayMode::Scientific(precision) => { CalculatorDisplayMode::Scientific{precision} => {
format!("{:>2}: {}", i, fmt_scientific(*m, *precision)) format!("{:>2}: {}", i, fmt_scientific(*m, *precision))
} }
CalculatorDisplayMode::Engineering(precision) => { CalculatorDisplayMode::Engineering{precision} => {
format!("{:>2}: {}", i, fmt_engineering(*m, *precision)) format!("{:>2}: {}", i, fmt_engineering(*m, *precision))
} }
CalculatorDisplayMode::Fixed(precision) => { CalculatorDisplayMode::Fixed{precision} => {
format!("{:>2}: {:.precision$}", i, m, precision = precision) format!("{:>2}: {:.precision$}", i, m, precision = precision)
} }
}, },