base program

This commit is contained in:
nora 2021-02-01 21:24:34 +01:00
commit b3ee815b51
5 changed files with 273 additions and 0 deletions

142
src/converter.rs Normal file
View file

@ -0,0 +1,142 @@
pub fn convert(from: &str, to: &str, val: &str) -> Result<String, String> {
let int_value = match from {
"b" => from_bin_to_int(val)?,
"o" => from_oct_to_int(val)?,
"d" => from_dec_to_int(val),
"h" => from_hex_to_int(val)?,
_ => return Err(format!("Not a valid system: {}", from))
};
match to {
"b" => Ok(from_int_to_bin(int_value)),
"o" => Ok(from_int_to_oct(int_value)),
"d" => Ok(from_int_to_dec(int_value)),
"h" => Ok(from_int_to_hex(int_value)),
_ =>Err(format!("Not a valid system: {}", from))
}
}
pub fn from_int_to_oct(mut val: i32) -> String {
let mut s = String::new();
if val == 0 {
s += "0";
}
while val > 0 {
let rest = val % 8;
s += &rest.to_string();
val = val / 8;
}
return s.chars().rev().collect();
}
pub fn from_int_to_hex(mut val: i32) -> String {
let mut s = String::new();
if val == 0 {
s += "0";
}
while val > 0 {
let rest = val % 16;
let to_string = rest.to_string();
s += match rest {
10 => "A",
11 => "B",
12 => "C",
13 => "D",
14 => "E",
15 => "F",
_ => &to_string
};
val = val / 16;
}
return s.chars().rev().collect();
}
pub fn from_int_to_bin(mut val: i32) -> String {
let mut s = String::new();
if val == 0 {
s += "0";
}
while val > 0 {
let rest = val % 2;
s += &rest.to_string();
val = val / 2;
}
return s.chars().rev().collect();
}
pub fn from_int_to_dec(val: i32) -> String {
val.to_string()
}
pub fn from_dec_to_int(val: &str) -> i32 {
val.parse().expect("Not a valid decimal number")
}
pub fn from_oct_to_int(val: &str) -> Result<i32, String> {
let mut dec = 0;
for (i, c) in val.chars().rev().enumerate() {
let exp = i32::pow(8, i as u32);
dec += exp * match c.to_ascii_lowercase() {
'0' => 0,
'1' => 1,
'2' => 2,
'3' => 3,
'4' => 4,
'5' => 5,
'6' => 6,
'7' => 7,
_ => return Err(format!("Not a valid octal number: {} at char {}: {}", val, i, c))
};
}
return Ok(dec);
}
pub fn from_hex_to_int(val: &str) -> Result<i32, String> {
let mut dec = 0;
for (i, c) in val.chars().rev().enumerate() {
let exp = i32::pow(16, i as u32);
dec += exp * match c.to_ascii_lowercase() {
'0' => 0,
'1' => 1,
'2' => 2,
'3' => 3,
'4' => 4,
'5' => 5,
'6' => 6,
'7' => 7,
'8' => 8,
'9' => 9,
'a' => 10,
'b' => 11,
'c' => 12,
'd' => 13,
'e' => 14,
'f' => 15,
_ => return Err(format!("Not a valid hex number: {} at char {}: {}", val, i, c))
};
}
return Ok(dec);
}
pub fn from_bin_to_int(val: &str) -> Result<i32, String> {
let mut dec = 0;
for (i, c) in val.chars().rev().enumerate() {
let exp = i32::pow(2, i as u32);
if c == '1' {
dec += exp;
} else if c == '0' {} else {
return Err(format!("Not a valid binary number: {} at char {}: {}", val, i, c));
}
}
return Ok(dec);
}

54
src/main.rs Normal file
View file

@ -0,0 +1,54 @@
mod converter;
#[macro_use]
extern crate lazy_static;
extern crate regex;
use std::io;
use regex::Regex;
use std::result::Result::Err;
fn main() {
println!("Enter a conversion | help");
loop {
let mut input = String::new();
io::stdin()
.read_line(&mut input)
.expect("Failed to read line");
let trimmed = input.trim();
if trimmed == "help" {
println!("Enter a number and end it with a suffix [bodh] and then a space and the system you want it converted to.\n\
Example: '255d h'\n\
Will lead to: 'FF'");
} else if trimmed == "exit" || trimmed == "c" || trimmed == "x"{
break;
} else {
let splits = split(trimmed);
match splits {
Ok(a) => {
match converter::convert(&a.1, &a.2, &a.0) {
Ok(a) => println!("{}", a),
Err(e) => println!("{}", e)
}
}
Err(_) => println!("Invalid input")
}
}
}
}
fn split(s: &str) -> Result<(String, String, String), ()> {
lazy_static! {
static ref RE: Regex = Regex::new(r"^(\w+) ?(\w) (\w)$").unwrap();
}
for capture in RE.captures_iter(s) {
return Ok((capture[1].to_string(), capture[2].to_string(), capture[3].to_string()));
}
Err(())
}