Add parsing capabilities; change to read CSV files instead of standard input
This commit is contained in:
parent
bcec7a8b4b
commit
1010ac0e20
4 changed files with 53 additions and 11 deletions
|
@ -8,3 +8,4 @@ edition = "2018"
|
|||
|
||||
[dependencies]
|
||||
csv = "1.1.3"
|
||||
argparse = "0.2.2"
|
|
@ -2,7 +2,7 @@ use std::rc::{Rc, Weak};
|
|||
use std::cell::{RefCell};
|
||||
use std::fmt::Formatter;
|
||||
|
||||
static mut DEBUG: bool = false;
|
||||
pub static mut DEBUG: bool = false;
|
||||
|
||||
#[derive(Clone, Debug, Eq, PartialEq)]
|
||||
pub enum CellValue {
|
||||
|
|
57
src/main.rs
57
src/main.rs
|
@ -5,24 +5,65 @@ use sudoku_solver::solver::solve_grid;
|
|||
|
||||
|
||||
fn main() {
|
||||
let mut grid = read_grid().unwrap();
|
||||
let mut debug = false;
|
||||
let mut filename = String::new();
|
||||
{ // this block limits scope of borrows by ap.refer() method
|
||||
let mut ap = argparse::ArgumentParser::new();
|
||||
ap.set_description("Solve Sudoku puzzles");
|
||||
ap.refer(&mut debug)
|
||||
.add_option(&["--debug"], argparse::StoreTrue, "Run in debug mode");
|
||||
|
||||
println!("{}", grid);
|
||||
ap.refer(&mut filename)
|
||||
.required()
|
||||
.add_argument("filename", argparse::Store, "Path to puzzle CSV file");
|
||||
|
||||
ap.parse_args_or_exit();
|
||||
}
|
||||
|
||||
if debug {
|
||||
unsafe {
|
||||
sudoku_solver::grid::DEBUG = true;
|
||||
sudoku_solver::solver::DEBUG = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
let mut grid = match read_grid(&filename) {
|
||||
Ok(grid) => grid,
|
||||
Err(e) => {
|
||||
eprintln!("Error while reading grid: \"{}\"", e);
|
||||
std::process::exit(1);
|
||||
}
|
||||
};
|
||||
|
||||
println!("Grid to be solved:\n{}", grid);
|
||||
|
||||
println!("Solving grid");
|
||||
solve_grid(&mut grid);
|
||||
println!("{}", grid);
|
||||
|
||||
println!("Solved grid:\n{}", grid);
|
||||
|
||||
|
||||
}
|
||||
|
||||
fn read_grid() -> Result<Grid, &'static str> {
|
||||
let mut reader = csv::ReaderBuilder::new()
|
||||
fn read_grid(filename: &str) -> Result<Grid, String> {
|
||||
let reader_result = csv::ReaderBuilder::new()
|
||||
.has_headers(false)
|
||||
.from_reader(std::io::stdin());
|
||||
.from_path(filename);
|
||||
|
||||
let mut reader = match reader_result {
|
||||
Ok(reader) => reader,
|
||||
Err(e) => {
|
||||
let e = e.to_string();
|
||||
return Err(e);
|
||||
}
|
||||
};
|
||||
|
||||
let grid = Grid::new();
|
||||
let mut row = 0;
|
||||
for result in reader.records() {
|
||||
if row > 8 {
|
||||
return Err("Hit row limit");
|
||||
return Err("Hit row limit".to_string());
|
||||
}
|
||||
|
||||
let record = result.unwrap();
|
||||
|
@ -39,7 +80,7 @@ fn read_grid() -> Result<Grid, &'static str> {
|
|||
}
|
||||
|
||||
},
|
||||
Err(_error) => {return Err("Invalid cell value")}
|
||||
Err(_error) => {return Err("Invalid cell value".to_string())}
|
||||
};
|
||||
|
||||
},
|
||||
|
|
|
@ -5,7 +5,7 @@ use std::collections::HashSet;
|
|||
|
||||
use crate::grid::{Cell, Line, Grid, CellValue, LineType};
|
||||
|
||||
static mut DEBUG: bool = false;
|
||||
pub static mut DEBUG: bool = false;
|
||||
|
||||
struct FauxCell{
|
||||
index: usize,
|
||||
|
|
Loading…
Reference in a new issue