diff options
| author | Sam Anthony <sam@samanthony.xyz> | 2023-02-01 19:50:32 -0330 |
|---|---|---|
| committer | Sam Anthony <sam@samanthony.xyz> | 2023-02-01 19:50:32 -0330 |
| commit | 6e6e7581b4c8575dd379f20a786108ce4edcd9c8 (patch) | |
| tree | 5b1ecf5b07d62e25648a23dd1a2d43260b2ff365 /src/main.rs | |
| parent | dfbaad1f881be6ca3e93e09da360652ba5023b7d (diff) | |
| download | pfc-6e6e7581b4c8575dd379f20a786108ce4edcd9c8.zip | |
refactor
Diffstat (limited to 'src/main.rs')
| -rw-r--r-- | src/main.rs | 112 |
1 files changed, 3 insertions, 109 deletions
diff --git a/src/main.rs b/src/main.rs index 89c47aa..be9f440 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,114 +1,8 @@ -use crossterm::event::{self, Event, KeyCode, KeyEvent, KeyModifiers}; +use crossterm::event::{self, Event}; use std::io; -use tui::{ - backend::Backend, - layout::{Constraint, Direction, Layout}, - widgets::{List, ListItem, Paragraph}, - Frame, Terminal, -}; +use tui::{backend::Backend, Terminal}; -use pfc::{ui, Operator}; - -enum Signal { - None, - Exit, -} - -#[derive(Default)] -struct Calculator { - stack: Vec<f64>, - input_buffer: String, -} - -impl Calculator { - fn handle_input(&mut self, key: KeyEvent) -> Signal { - match key.modifiers { - KeyModifiers::CONTROL => match key.code { - KeyCode::Char('c') => { - return Signal::Exit; - } - _ => {} - }, - KeyModifiers::NONE => match key.code { - KeyCode::Char('q') => { - return Signal::Exit; - } - KeyCode::Char(c) => { - if c.is_ascii_digit() { - self.input_buffer.push(c); - } else if c == '.' && !self.input_buffer.contains('.') { - if self.input_buffer.len() == 0 { - self.input_buffer.push('0'); - } - self.input_buffer.push(c); - } else if let Ok(op) = Operator::parse(c) { - if self.input_buffer.len() > 0 { - self.push_buffer_to_stack(); - } - self.perform_operation(op); - } - } - KeyCode::Enter if self.input_buffer.len() > 0 => { - self.push_buffer_to_stack(); - } - KeyCode::Backspace => { - self.input_buffer.pop(); - } - _ => {} - }, - _ => {} - } - return Signal::None; - } - - fn draw<B: Backend>(&self, f: &mut Frame<B>) { - let chunks = Layout::default() - .direction(Direction::Vertical) - .constraints( - [ - Constraint::Max(u16::MAX), - Constraint::Length(self.stack.len() as u16), - Constraint::Length(1), - ] - .as_ref(), - ) - .split(f.size()); - - let items: Vec<ListItem> = (self.stack) - .iter() - .map(|f| ListItem::new(format!("{}", f))) - .collect(); - f.render_widget(List::new(items), chunks[1]); - - f.render_widget(Paragraph::new(self.input_buffer.as_str()), chunks[2]); - } - - fn perform_operation(&mut self, op: Operator) { - let rhs = match self.stack.pop() { - Some(f) => f, - None => { - return; - } - }; - let lhs = match self.stack.pop() { - Some(f) => f, - None => { - return; - } - }; - match op { - Operator::Add => self.stack.push(lhs + rhs), - Operator::Sub => self.stack.push(lhs - rhs), - Operator::Mul => self.stack.push(lhs * rhs), - Operator::Div => self.stack.push(lhs / rhs), - } - } - - fn push_buffer_to_stack(&mut self) { - self.stack.push(self.input_buffer.parse::<f64>().unwrap()); - self.input_buffer = String::new(); - } -} +use pfc::{ui, Calculator, Signal}; fn main() -> io::Result<()> { let calculator = Calculator::default(); |