Implement is_complete for transactions and queries
This commit is contained in:
parent
102e528310
commit
a8bb996e4f
5 changed files with 33 additions and 12 deletions
|
@ -31,3 +31,6 @@ path = "../.."
|
||||||
|
|
||||||
[dependencies.mentat_parser_utils]
|
[dependencies.mentat_parser_utils]
|
||||||
path = "../../parser-utils"
|
path = "../../parser-utils"
|
||||||
|
|
||||||
|
[dependencies.edn]
|
||||||
|
path = "../../edn"
|
||||||
|
|
|
@ -30,6 +30,8 @@ use combine::combinator::{
|
||||||
|
|
||||||
use errors as cli;
|
use errors as cli;
|
||||||
|
|
||||||
|
use edn;
|
||||||
|
|
||||||
pub static HELP_COMMAND: &'static str = &"help";
|
pub static HELP_COMMAND: &'static str = &"help";
|
||||||
pub static OPEN_COMMAND: &'static str = &"open";
|
pub static OPEN_COMMAND: &'static str = &"open";
|
||||||
pub static CLOSE_COMMAND: &'static str = &"close";
|
pub static CLOSE_COMMAND: &'static str = &"close";
|
||||||
|
@ -52,8 +54,10 @@ impl Command {
|
||||||
/// TODO: for query and transact commands, they will be considered complete if a parsable EDN has been entered as an argument
|
/// TODO: for query and transact commands, they will be considered complete if a parsable EDN has been entered as an argument
|
||||||
pub fn is_complete(&self) -> bool {
|
pub fn is_complete(&self) -> bool {
|
||||||
match self {
|
match self {
|
||||||
&Command::Query(_) |
|
&Command::Query(ref args) |
|
||||||
&Command::Transact(_) => false,
|
&Command::Transact(ref args) => {
|
||||||
|
edn::parse::value(&args).is_ok()
|
||||||
|
},
|
||||||
&Command::Help(_) |
|
&Command::Help(_) |
|
||||||
&Command::Open(_) |
|
&Command::Open(_) |
|
||||||
&Command::Close => true
|
&Command::Close => true
|
||||||
|
|
|
@ -22,6 +22,12 @@ use command_parser::{
|
||||||
|
|
||||||
use errors as cli;
|
use errors as cli;
|
||||||
|
|
||||||
|
/// Starting prompt
|
||||||
|
const DEFAULT_PROMPT: &'static str = "mentat=> ";
|
||||||
|
/// Prompt when further input is being read
|
||||||
|
// TODO: Should this actually reflect the current open brace?
|
||||||
|
const MORE_PROMPT: &'static str = "mentat.> ";
|
||||||
|
|
||||||
/// Possible results from reading input from `InputReader`
|
/// Possible results from reading input from `InputReader`
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
pub enum InputResult {
|
pub enum InputResult {
|
||||||
|
@ -66,8 +72,8 @@ impl InputReader {
|
||||||
/// Reads a single command, item, or statement from `stdin`.
|
/// Reads a single command, item, or statement from `stdin`.
|
||||||
/// Returns `More` if further input is required for a complete result.
|
/// Returns `More` if further input is required for a complete result.
|
||||||
/// In this case, the input received so far is buffered internally.
|
/// In this case, the input received so far is buffered internally.
|
||||||
pub fn read_input(&mut self, prompt: &str) -> Result<InputResult, cli::Error> {
|
pub fn read_input(&mut self, in_process_cmd: Option<Command>) -> Result<InputResult, cli::Error> {
|
||||||
let line = match self.read_line(prompt) {
|
let line = match self.read_line(if in_process_cmd.is_some() { MORE_PROMPT } else { DEFAULT_PROMPT }) {
|
||||||
Some(s) => s,
|
Some(s) => s,
|
||||||
None => return Ok(Eof),
|
None => return Ok(Eof),
|
||||||
};
|
};
|
||||||
|
@ -80,7 +86,19 @@ impl InputReader {
|
||||||
|
|
||||||
self.add_history(&line);
|
self.add_history(&line);
|
||||||
|
|
||||||
let cmd = try!(command(&self.buffer));
|
let cmd = match in_process_cmd {
|
||||||
|
Some(Command::Query(args)) => {
|
||||||
|
Command::Query(args + " " + &line)
|
||||||
|
},
|
||||||
|
Some(Command::Transact(args)) => {
|
||||||
|
Command::Transact(args + " " + &line)
|
||||||
|
},
|
||||||
|
_ => {
|
||||||
|
try!(command(&self.buffer))
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
println!("processing {:?}", cmd);
|
||||||
|
|
||||||
match cmd {
|
match cmd {
|
||||||
Command::Query(_) |
|
Command::Query(_) |
|
||||||
|
|
|
@ -21,6 +21,7 @@ extern crate linefeed;
|
||||||
extern crate rusqlite;
|
extern crate rusqlite;
|
||||||
|
|
||||||
extern crate mentat;
|
extern crate mentat;
|
||||||
|
extern crate edn;
|
||||||
|
|
||||||
use getopts::Options;
|
use getopts::Options;
|
||||||
|
|
||||||
|
|
|
@ -27,12 +27,6 @@ use store::{
|
||||||
db_output_name
|
db_output_name
|
||||||
};
|
};
|
||||||
|
|
||||||
/// Starting prompt
|
|
||||||
const DEFAULT_PROMPT: &'static str = "mentat=> ";
|
|
||||||
/// Prompt when further input is being read
|
|
||||||
// TODO: Should this actually reflect the current open brace?
|
|
||||||
const MORE_PROMPT: &'static str = "mentat.> ";
|
|
||||||
|
|
||||||
lazy_static! {
|
lazy_static! {
|
||||||
static ref COMMAND_HELP: HashMap<&'static str, &'static str> = {
|
static ref COMMAND_HELP: HashMap<&'static str, &'static str> = {
|
||||||
let mut map = HashMap::new();
|
let mut map = HashMap::new();
|
||||||
|
@ -62,7 +56,8 @@ impl Repl {
|
||||||
let mut input = InputReader::new();
|
let mut input = InputReader::new();
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
let res = input.read_input(if more.is_some() { MORE_PROMPT } else { DEFAULT_PROMPT });
|
let res = input.read_input(more.clone());
|
||||||
|
|
||||||
match res {
|
match res {
|
||||||
Ok(MetaCommand(cmd)) => {
|
Ok(MetaCommand(cmd)) => {
|
||||||
debug!("read command: {:?}", cmd);
|
debug!("read command: {:?}", cmd);
|
||||||
|
|
Loading…
Reference in a new issue