commit 994f86650d03433ed3ca4ec9c649c335eee25f96
parent f5e3b90bbda00a01ab80a0585e825214ad6fc49e
Author: Ethan Long <ethan@Ethans-MacBook-Pro.local>
Date: Wed, 29 Nov 2023 15:57:42 +1100
Some minor prettification
Diffstat:
5 files changed, 41 insertions(+), 26 deletions(-)
diff --git a/src/bin/dfa.rs b/src/bin/dfa.rs
@@ -1,9 +1,9 @@
+use automaton::{dfa::DFA, Automaton, Encodable};
use std::{env, error::Error, fmt::Display, fs};
-use automaton::{dfa::DFA,Encodable,Automaton};
#[derive(Debug)]
struct CommandLineError {
- reason: String
+ reason: String,
}
impl Display for CommandLineError {
@@ -15,7 +15,7 @@ impl Display for CommandLineError {
impl CommandLineError {
fn cause(reason: &str) -> Self {
CommandLineError {
- reason: reason.to_owned()
+ reason: reason.to_owned(),
}
}
}
@@ -30,11 +30,15 @@ fn main() -> Result<(), Box<dyn Error>> {
let args: Vec<String> = env::args().collect();
if args.len() != 3 {
- return Err(Box::new(CommandLineError::cause(&usage(args.get(0).map_or("automaton", |s| s)))));
+ return Err(Box::new(CommandLineError::cause(&usage(
+ args.get(0).map_or("automaton", |s| s),
+ ))));
}
let dfa_json = fs::read_to_string(args.get(1).unwrap_or(&"".to_owned()))?;
- let input_string = args.get(2).ok_or(Box::new(CommandLineError::cause("No input string provided!")))?;
+ let input_string = args
+ .get(2)
+ .ok_or(CommandLineError::cause("No input string provided!"))?;
let dfa: DFA = DFA::parse(dfa_json.as_str())?;
println!("DFA:\n{dfa}\n");
@@ -43,5 +47,3 @@ fn main() -> Result<(), Box<dyn Error>> {
Ok(())
}
-
-
diff --git a/src/bin/nfa.rs b/src/bin/nfa.rs
@@ -1,9 +1,9 @@
+use automaton::{dfa::DFA, nfa::NFA, Automaton, Encodable, FiniteStateAutomaton};
use std::{env, error::Error, fmt::Display, fs};
-use automaton::{nfa::NFA,Encodable,Automaton,dfa::DFA, FiniteStateAutomaton};
#[derive(Debug)]
struct CommandLineError {
- reason: String
+ reason: String,
}
impl Display for CommandLineError {
@@ -15,7 +15,7 @@ impl Display for CommandLineError {
impl CommandLineError {
fn cause(reason: &str) -> Self {
CommandLineError {
- reason: reason.to_owned()
+ reason: reason.to_owned(),
}
}
}
@@ -30,11 +30,15 @@ fn main() -> Result<(), Box<dyn Error>> {
let args: Vec<String> = env::args().collect();
if args.len() != 3 {
- return Err(Box::new(CommandLineError::cause(&usage(args.get(0).map_or("automaton", |s| s)))));
+ return Err(Box::new(CommandLineError::cause(&usage(
+ args.get(0).map_or("automaton", |s| s),
+ ))));
}
let nfa_json = fs::read_to_string(args.get(1).unwrap_or(&"".to_owned()))?;
- let input_string = args.get(2).ok_or(Box::new(CommandLineError::cause("No input string provided!")))?;
+ let input_string = args
+ .get(2)
+ .ok_or(CommandLineError::cause("No input string provided!"))?;
let nfa: NFA = NFA::parse(nfa_json.as_str())?;
println!("NFA:\n{nfa}\n");
diff --git a/src/lib/automaton.rs b/src/lib/automaton.rs
@@ -17,7 +17,10 @@ pub trait FiniteStateAutomaton: Automaton {
Self: Sized;
}
-pub trait Encodable<T> where Self: Sized {
+pub trait Encodable<T>
+where
+ Self: Sized,
+{
fn parse(encoding: T) -> Result<Self, Box<dyn Error>>;
}
diff --git a/src/lib/nfa.rs b/src/lib/nfa.rs
@@ -107,7 +107,9 @@ impl FiniteStateAutomaton for NFA {
let current_states = state_reverse_map
.clone()
.get(¤t_newstate)
- .ok_or(NFAParseError::error("We should have already added this state into the reverse map!"))?
+ .ok_or(NFAParseError::error(
+ "We should have already added this state into the reverse map!",
+ ))?
.to_owned();
let to: BTreeSet<u64> = current_states
.iter()
@@ -131,7 +133,8 @@ impl FiniteStateAutomaton for NFA {
state_forward_map.insert(to.clone(), newest_newstate);
state_reverse_map.insert(newest_newstate, to.clone());
transition_table.insert((current_newstate, *c), newest_newstate);
- if to.len() == 0 { // Trap state!
+ if to.len() == 0 {
+ // Trap state!
for c in self.alphabet.iter() {
transition_table.insert((newest_newstate, *c), newest_newstate);
}
@@ -271,16 +274,11 @@ impl Encodable<Value> for NFA {
.iter()
.map(|v| v.as_u64())
.collect::<Option<_>>()
- .ok_or(NFAParseError::error(
- "Could not convert the states to u64",
- ))?;
+ .ok_or(NFAParseError::error("Could not convert the states to u64"))?;
- let initial_state: u64 =
- json["initial_state"]
- .as_u64()
- .ok_or(NFAParseError::error(
- "Initial state incorrectly formatted",
- ))?;
+ let initial_state: u64 = json["initial_state"]
+ .as_u64()
+ .ok_or(NFAParseError::error("Initial state incorrectly formatted"))?;
let final_states: HashSet<u64> = json["final_states"]
.as_array()
diff --git a/src/lib/tests/nfa_tests.rs b/src/lib/tests/nfa_tests.rs
@@ -1,4 +1,8 @@
-use crate::{nfa::NFA, Automaton, Encodable, FiniteStateAutomaton, tests::testlib::util::{rand_string, read_directory}};
+use crate::{
+ nfa::NFA,
+ tests::testlib::util::{rand_string, read_directory},
+ Automaton, Encodable, FiniteStateAutomaton,
+};
use std::fs;
#[test]
@@ -43,7 +47,11 @@ fn run_static_nfa_tests() {
.collect();
assert_eq!(inputs.len(), expected.len());
for ((index, input), expect) in inputs.iter().enumerate().zip(expected) {
- assert_eq!(nfa.accepts(input), expect, "Test no: {index}, input: {input}");
+ assert_eq!(
+ nfa.accepts(input),
+ expect,
+ "Test no: {index}, input: {input}"
+ );
}
println!(
"Successfully ran {} tests in {}",