Add option to specify output color choice
This commit is contained in:
parent
739cae1f7c
commit
499fa0c667
@ -1,10 +1,11 @@
|
|||||||
pub fn run<P>(program_path: P, specification_path: P,
|
pub fn run<P>(program_path: P, specification_path: P,
|
||||||
proof_direction: crate::problem::ProofDirection, no_simplify: bool)
|
proof_direction: crate::problem::ProofDirection, no_simplify: bool,
|
||||||
|
color_choice: crate::output::ColorChoice)
|
||||||
where
|
where
|
||||||
P: AsRef<std::path::Path>,
|
P: AsRef<std::path::Path>,
|
||||||
{
|
{
|
||||||
//let context = crate::translate::verify_properties::Context::new();
|
//let context = crate::translate::verify_properties::Context::new();
|
||||||
let mut problem = crate::Problem::new();
|
let mut problem = crate::Problem::new(color_choice);
|
||||||
|
|
||||||
log::info!("reading specification “{}”", specification_path.as_ref().display());
|
log::info!("reading specification “{}”", specification_path.as_ref().display());
|
||||||
|
|
||||||
|
@ -22,6 +22,7 @@ pub enum Kind
|
|||||||
//ParseConstantDeclaration,
|
//ParseConstantDeclaration,
|
||||||
UnknownProofDirection(String),
|
UnknownProofDirection(String),
|
||||||
UnknownDomainIdentifier(String),
|
UnknownDomainIdentifier(String),
|
||||||
|
UnknownColorChoice(String),
|
||||||
VariableNameNotAllowed(String),
|
VariableNameNotAllowed(String),
|
||||||
FormulaNotClosed(std::rc::Rc<crate::VariableDeclarations>),
|
FormulaNotClosed(std::rc::Rc<crate::VariableDeclarations>),
|
||||||
NoCompletedDefinitionFound(std::rc::Rc<crate::PredicateDeclaration>),
|
NoCompletedDefinitionFound(std::rc::Rc<crate::PredicateDeclaration>),
|
||||||
@ -142,6 +143,11 @@ impl Error
|
|||||||
Self::new(Kind::UnknownDomainIdentifier(domain_identifier))
|
Self::new(Kind::UnknownDomainIdentifier(domain_identifier))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub(crate) fn new_unknown_color_choice(color_choice: String) -> Self
|
||||||
|
{
|
||||||
|
Self::new(Kind::UnknownColorChoice(color_choice))
|
||||||
|
}
|
||||||
|
|
||||||
pub(crate) fn new_variable_name_not_allowed(variable_name: String) -> Self
|
pub(crate) fn new_variable_name_not_allowed(variable_name: String) -> Self
|
||||||
{
|
{
|
||||||
Self::new(Kind::VariableNameNotAllowed(variable_name))
|
Self::new(Kind::VariableNameNotAllowed(variable_name))
|
||||||
@ -230,6 +236,8 @@ impl std::fmt::Debug for Error
|
|||||||
"unknown proof direction “{}” (allowed: integer, program)", proof_direction),
|
"unknown proof direction “{}” (allowed: integer, program)", proof_direction),
|
||||||
Kind::UnknownDomainIdentifier(ref domain_identifier) => write!(formatter,
|
Kind::UnknownDomainIdentifier(ref domain_identifier) => write!(formatter,
|
||||||
"unknown domain identifier “{}” (allowed: int, program)", domain_identifier),
|
"unknown domain identifier “{}” (allowed: int, program)", domain_identifier),
|
||||||
|
Kind::UnknownColorChoice(ref color_choice) => write!(formatter,
|
||||||
|
"unknown color choice “{}” (allowed: auto, always, never)", color_choice),
|
||||||
Kind::VariableNameNotAllowed(ref variable_name) => write!(formatter,
|
Kind::VariableNameNotAllowed(ref variable_name) => write!(formatter,
|
||||||
"variable name “{}” not allowed (program variables must start with X, Y, or Z and integer variables with I, J, K, L, M, or N)",
|
"variable name “{}” not allowed (program variables must start with X, Y, or Z and integer variables with I, J, K, L, M, or N)",
|
||||||
variable_name),
|
variable_name),
|
||||||
|
@ -23,6 +23,10 @@ enum Command
|
|||||||
/// Do not simplify translated program
|
/// Do not simplify translated program
|
||||||
#[structopt(long)]
|
#[structopt(long)]
|
||||||
no_simplify: bool,
|
no_simplify: bool,
|
||||||
|
|
||||||
|
/// Whether to use colors in the output (auto, always, never)
|
||||||
|
#[structopt(name = "color", long, default_value = "auto")]
|
||||||
|
color_choice: anthem::output::ColorChoice,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -40,8 +44,9 @@ fn main()
|
|||||||
specification_path,
|
specification_path,
|
||||||
proof_direction,
|
proof_direction,
|
||||||
no_simplify,
|
no_simplify,
|
||||||
|
color_choice,
|
||||||
}
|
}
|
||||||
=> anthem::commands::verify_program::run(&program_path, &specification_path,
|
=> anthem::commands::verify_program::run(&program_path, &specification_path,
|
||||||
proof_direction, no_simplify),
|
proof_direction, no_simplify, color_choice),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
pub(crate) mod shell;
|
pub(crate) mod shell;
|
||||||
pub(crate) mod tptp;
|
pub(crate) mod tptp;
|
||||||
|
|
||||||
|
pub use shell::ColorChoice;
|
||||||
pub(crate) use shell::Shell;
|
pub(crate) use shell::Shell;
|
||||||
|
|
||||||
#[derive(Clone, Copy, Debug, Eq, Ord, PartialEq, PartialOrd)]
|
#[derive(Clone, Copy, Debug, Eq, Ord, PartialEq, PartialOrd)]
|
||||||
|
@ -6,12 +6,7 @@ pub struct Shell
|
|||||||
enum ShellOutput
|
enum ShellOutput
|
||||||
{
|
{
|
||||||
Basic(Box<dyn std::io::Write>),
|
Basic(Box<dyn std::io::Write>),
|
||||||
WithColorSupport
|
WithColorSupport(termcolor::StandardStream),
|
||||||
{
|
|
||||||
stream: termcolor::StandardStream,
|
|
||||||
color_choice: ColorChoice,
|
|
||||||
is_a_tty: bool,
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Copy, Eq, PartialEq)]
|
#[derive(Clone, Copy, Eq, PartialEq)]
|
||||||
@ -24,16 +19,15 @@ pub enum ColorChoice
|
|||||||
|
|
||||||
impl Shell
|
impl Shell
|
||||||
{
|
{
|
||||||
pub fn from_stdout() -> Self
|
pub fn from_stdout(color_choice: ColorChoice) -> Self
|
||||||
{
|
{
|
||||||
Self
|
Self
|
||||||
{
|
{
|
||||||
output: ShellOutput::WithColorSupport
|
output: match color_choice
|
||||||
{
|
{
|
||||||
stream:
|
ColorChoice::Never => ShellOutput::Basic(Box::new(std::io::stdout())),
|
||||||
termcolor::StandardStream::stdout(ColorChoice::Auto.to_termcolor_color_choice()),
|
_ => ShellOutput::WithColorSupport(termcolor::StandardStream::stdout(
|
||||||
color_choice: ColorChoice::Auto,
|
color_choice.to_termcolor_color_choice())),
|
||||||
is_a_tty: atty::is(atty::Stream::Stdout),
|
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -67,7 +61,7 @@ impl ShellOutput
|
|||||||
match *self
|
match *self
|
||||||
{
|
{
|
||||||
Self::Basic(ref mut write) => write!(write, "{}", text),
|
Self::Basic(ref mut write) => write!(write, "{}", text),
|
||||||
Self::WithColorSupport{ref mut stream, ..} =>
|
Self::WithColorSupport(ref mut stream) =>
|
||||||
{
|
{
|
||||||
stream.reset()?;
|
stream.reset()?;
|
||||||
stream.set_color(color)?;
|
stream.set_color(color)?;
|
||||||
@ -89,7 +83,7 @@ impl ShellOutput
|
|||||||
match *self
|
match *self
|
||||||
{
|
{
|
||||||
Self::Basic(ref mut write) => writeln!(write, ""),
|
Self::Basic(ref mut write) => writeln!(write, ""),
|
||||||
Self::WithColorSupport{ref mut stream, ..} => writeln!(stream, ""),
|
Self::WithColorSupport(ref mut stream) => writeln!(stream, ""),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -103,7 +97,7 @@ impl ShellOutput
|
|||||||
let _ = match *self
|
let _ = match *self
|
||||||
{
|
{
|
||||||
Self::Basic(ref mut write) => write.write_all(erase_sequence),
|
Self::Basic(ref mut write) => write.write_all(erase_sequence),
|
||||||
Self::WithColorSupport{ref mut stream, ..} => stream.write_all(erase_sequence),
|
Self::WithColorSupport(ref mut stream) => stream.write_all(erase_sequence),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -124,3 +118,32 @@ impl ColorChoice
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl std::fmt::Debug for ColorChoice
|
||||||
|
{
|
||||||
|
fn fmt(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result
|
||||||
|
{
|
||||||
|
match self
|
||||||
|
{
|
||||||
|
ColorChoice::Always => write!(formatter, "always"),
|
||||||
|
ColorChoice::Never => write!(formatter, "never"),
|
||||||
|
ColorChoice::Auto => write!(formatter, "auto"),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl std::str::FromStr for ColorChoice
|
||||||
|
{
|
||||||
|
type Err = crate::Error;
|
||||||
|
|
||||||
|
fn from_str(s: &str) -> Result<Self, Self::Err>
|
||||||
|
{
|
||||||
|
match s
|
||||||
|
{
|
||||||
|
"always" => Ok(ColorChoice::Always),
|
||||||
|
"never" => Ok(ColorChoice::Never),
|
||||||
|
"auto" => Ok(ColorChoice::Auto),
|
||||||
|
_ => Err(crate::Error::new_unknown_color_choice(s.to_string())),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -28,7 +28,7 @@ pub struct Problem
|
|||||||
|
|
||||||
impl Problem
|
impl Problem
|
||||||
{
|
{
|
||||||
pub fn new() -> Self
|
pub fn new(color_choice: crate::output::ColorChoice) -> Self
|
||||||
{
|
{
|
||||||
Self
|
Self
|
||||||
{
|
{
|
||||||
@ -37,7 +37,7 @@ impl Problem
|
|||||||
|
|
||||||
statements: std::cell::RefCell::new(std::collections::BTreeMap::new()),
|
statements: std::cell::RefCell::new(std::collections::BTreeMap::new()),
|
||||||
|
|
||||||
shell: std::cell::RefCell::new(crate::output::Shell::from_stdout()),
|
shell: std::cell::RefCell::new(crate::output::Shell::from_stdout(color_choice)),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user