daisy/src/main.rs

175 lines
3.8 KiB
Rust
Raw Normal View History

2023-03-23 22:10:53 -07:00
use std::io::{Write, stdout, stdin};
2023-03-24 19:42:23 -07:00
2023-03-23 22:10:53 -07:00
use termion::event::Key;
use termion::input::TermRead;
use termion::raw::IntoRawMode;
use termion::raw::RawTerminal;
use termion::{color, style};
2023-03-18 22:16:26 -07:00
2023-03-27 09:47:02 -07:00
pub mod tokens;
2023-03-27 10:54:36 -07:00
pub mod parser;
pub mod evaluate;
2023-04-01 13:50:52 -07:00
pub mod quantity;
mod promptbuffer;
2023-03-27 09:47:02 -07:00
2023-03-24 19:42:23 -07:00
use crate::promptbuffer::PromptBuffer;
2023-04-01 13:50:52 -07:00
//use crate::tokens::Token;
//use crate::parser::ParserError;
2023-03-25 10:32:51 -07:00
//use crate::parser::LineLocation;
2023-03-18 22:16:26 -07:00
2023-03-25 12:14:05 -07:00
/*
###### @@@@@@
# ##@@ @
## #@ @@
2023-03-25 21:38:59 -07:00
@@@@@@@@@@@@@
2023-03-25 12:14:05 -07:00
@@ @# ##
@ @@## #
@@@@@@ ######
2023-03-25 21:38:59 -07:00
Daisy 0.0.1
2023-03-25 12:14:05 -07:00
*/
#[inline(always)]
fn draw_greeter(stdout: &mut RawTerminal<std::io::Stdout>) -> Result<(), std::io::Error> {
write!(
stdout,
"\n \
{a} ###### {b} @@@@@@\r\n \
{a}# ##{b}@@ @\r\n \
{a}## #{b}@ @@\r\n \
2023-03-25 21:38:59 -07:00
{a} {b}@@@@@@@@@@@@@{a}\r\n \
2023-03-25 12:14:05 -07:00
{b}@@ @{a}# ##\r\n \
{b}@ @@{a}## #\r\n \
{b} @@@@@@ {a} ###### {r}\r\n \
2023-03-27 10:59:11 -07:00
\n {t}Daisy{r} {v}v{ver}{r}\r\n\n",
r = format!("{}{}", color::Fg(color::Reset), style::Reset),
// Icon colors
2023-03-25 12:14:05 -07:00
a = color::Fg(color::Magenta),
b = color::Fg(color::White),
2023-03-27 10:59:11 -07:00
// Title format
2023-03-25 12:14:05 -07:00
t = format!("{}{}", color::Fg(color::White), style::Bold),
2023-03-27 10:59:11 -07:00
// Version
v = format!("{}{}", color::Fg(color::White), style::Italic),
ver = env!("CARGO_PKG_VERSION"),
2023-03-25 12:14:05 -07:00
)?;
return Ok(());
}
2023-03-18 22:16:26 -07:00
fn main() -> Result<(), std::io::Error> {
2023-03-23 22:10:53 -07:00
let mut stdout = stdout().into_raw_mode().unwrap();
2023-03-25 12:14:05 -07:00
draw_greeter(&mut stdout)?;
2023-04-07 09:42:50 -07:00
//let size = termion::terminal_size().unwrap();
2023-03-23 22:10:53 -07:00
//write!(stdout, "{:?}", size).unwrap();
2023-03-24 19:42:23 -07:00
let mut pb: PromptBuffer = PromptBuffer::new(64);
2023-03-23 22:10:53 -07:00
'outer: loop {
2023-03-27 22:13:14 -07:00
pb.write_prompt(&mut stdout)?;
2023-03-23 22:10:53 -07:00
let stdin = stdin();
for c in stdin.keys() {
if let Key::Char(q) = c.as_ref().unwrap() {
match q {
'\n' => {
let in_str = pb.enter();
2023-03-27 09:47:02 -07:00
write!(stdout, "\r\n")?;
if in_str == "" { break; }
2023-03-23 22:10:53 -07:00
2023-03-27 09:47:02 -07:00
#[cfg(debug_assertions)]
2023-03-23 22:10:53 -07:00
RawTerminal::suspend_raw_mode(&stdout)?;
let g = parser::parse(&in_str);
2023-03-27 09:47:02 -07:00
#[cfg(debug_assertions)]
2023-03-23 22:10:53 -07:00
RawTerminal::activate_raw_mode(&stdout)?;
match g {
2023-03-24 19:42:23 -07:00
Ok(g) => {
2023-03-27 09:47:02 -07:00
#[cfg(debug_assertions)]
RawTerminal::suspend_raw_mode(&stdout)?;
let out_str = g.print();
2023-03-28 14:36:53 -07:00
let g = evaluate::evaluate(g);
2023-03-27 09:47:02 -07:00
#[cfg(debug_assertions)]
RawTerminal::activate_raw_mode(&stdout)?;
write!(
stdout, " {}{}=>{}{} {}\r\n",
style::Bold, color::Fg(color::Magenta),
style::Reset, color::Fg(color::Reset),
out_str
)?;
2023-03-28 14:36:53 -07:00
match g {
2023-03-29 19:03:53 -07:00
Ok(q) => {
2023-03-28 14:36:53 -07:00
write!(
2023-03-29 19:03:53 -07:00
stdout, "\n {}{}={} {}{}\r\n\n",
2023-03-28 14:36:53 -07:00
style::Bold,
color::Fg(color::Green),
style::Reset,
2023-03-29 19:03:53 -07:00
q.print(),
2023-03-28 14:36:53 -07:00
color::Fg(color::Reset)
)?;
},
Err(_) => {
write!(
stdout, "\n {}{}Mathematical Error: {}Failed to evaluate expression.{}\r\n\n",
2023-03-28 14:36:53 -07:00
style::Bold,
color::Fg(color::Red),
style::Reset,
color::Fg(color::Reset),
)?;
}
}
2023-03-23 22:10:53 -07:00
},
2023-03-27 09:47:02 -07:00
// Show parse error
2023-03-23 22:10:53 -07:00
Err((l, e)) => {
write!(
2023-03-25 20:47:33 -07:00
stdout, "{}{}{} {}{}\r\n",
2023-03-23 22:10:53 -07:00
color::Fg(color::Red),
2023-03-25 09:54:07 -07:00
" ".repeat(l.pos + 4),
"^".repeat(l.len),
2023-03-25 20:47:33 -07:00
e.to_message(),
2023-03-23 22:10:53 -07:00
color::Fg(color::Reset),
)?;
}
};
break;
},
2023-03-24 19:42:23 -07:00
_ => { pb.add_char(*q); }
2023-03-23 22:10:53 -07:00
};
} else {
match c.unwrap() {
2023-03-24 19:42:23 -07:00
Key::Backspace => { pb.backspace(); },
Key::Delete => { pb.delete(); },
2023-03-27 22:13:14 -07:00
Key::Left => { pb.cursor_left(); },
Key::Right => { pb.cursor_right(); },
2023-03-24 19:42:23 -07:00
Key::Up => { pb.hist_up(); },
Key::Down => { pb.hist_down(); },
2023-04-07 09:42:50 -07:00
2023-03-23 22:10:53 -07:00
Key::Ctrl('d') |
Key::Ctrl('c') => { break 'outer; },
_ => {}
};
};
2023-03-24 20:21:48 -07:00
2023-03-27 22:13:14 -07:00
pb.write_prompt(&mut stdout)?;
2023-03-18 22:16:26 -07:00
}
}
2023-03-23 22:10:53 -07:00
write!(stdout, "\r\n")?;
return Ok(());
2023-03-27 10:54:36 -07:00
}
#[cfg(test)]
2023-04-07 18:16:22 -07:00
mod tests;