updates, clippy, formatting
[Mitarbeiter/Tim-Zeitz/stud-rust-base.git] / src / bin / encode_vector.rs
1 use stud_rust_base::{io::*, cli::CliErr};
2 use std::{env, error::Error};
3
4 fn main() -> Result<(), Box<dyn Error>> {
5     let mut args = env::args();
6     args.next();
7
8     match &args.collect::<Vec<String>>()[..] {
9         [data_type, output] => {
10             match data_type.as_ref() {
11                 "i8" => { parse_input::<i8>()?.write_to(output)?; Ok(()) },
12                 "u8" => { parse_input::<u8>()?.write_to(output)?; Ok(()) },
13                 "i16" => { parse_input::<i16>()?.write_to(output)?; Ok(()) },
14                 "u16" => { parse_input::<u16>()?.write_to(output)?; Ok(()) },
15                 "i32" => { parse_input::<i32>()?.write_to(output)?; Ok(()) },
16                 "u32" => { parse_input::<u32>()?.write_to(output)?; Ok(()) },
17                 "i64" => { parse_input::<i64>()?.write_to(output)?; Ok(()) },
18                 "u64" => { parse_input::<u64>()?.write_to(output)?; Ok(()) },
19                 "f32" => { parse_input::<f32>()?.write_to(output)?; Ok(()) },
20                 "f64" => { parse_input::<f64>()?.write_to(output)?; Ok(()) },
21                 "int8" => { parse_input::<i8>()?.write_to(output)?; Ok(()) },
22                 "uint8" => { parse_input::<u8>()?.write_to(output)?; Ok(()) },
23                 "int16" => { parse_input::<i16>()?.write_to(output)?; Ok(()) },
24                 "uint16" => { parse_input::<u16>()?.write_to(output)?; Ok(()) },
25                 "int32" => { parse_input::<i32>()?.write_to(output)?; Ok(()) },
26                 "uint32" => { parse_input::<u32>()?.write_to(output)?; Ok(()) },
27                 "int64" => { parse_input::<i64>()?.write_to(output)?; Ok(()) },
28                 "uint64" => { parse_input::<u64>()?.write_to(output)?; Ok(()) },
29                 "float32" => { parse_input::<f32>()?.write_to(output)?; Ok(()) },
30                 "float64" => { parse_input::<f64>()?.write_to(output)?; Ok(()) },
31                 _ => {
32                     print_usage();
33                     Err(Box::new(CliErr("Invalid data type")))
34                 }
35             }
36         },
37         _ => {
38             print_usage();
39             Err(Box::new(CliErr("Invalid arguments")))
40         },
41     }
42 }
43
44 fn print_usage() {
45     eprintln!("Usage: encode_vector data_type output_vector_file
46
47 Reads textual data from the standard input and writes it in a binary format to output_vector_file. The input data should be one data element per line. The data is only written once an end of file is encountered on the input. data_type can be one of
48 * i8
49 * u8
50 * i16
51 * u16
52 * i32
53 * u32
54 * i64
55 * u64
56 * f32
57 * f64
58
59 ");
60 }
61
62 use std::str::FromStr;
63
64 fn parse_input<T>() -> Result<Vec<T>, Box<dyn Error>> where
65     T: FromStr,
66     <T as FromStr>::Err: Error + 'static
67 {
68     use std::io::{BufRead, stdin};
69
70     let mut values = Vec::new();
71
72     let stdin = stdin();
73     for line in stdin.lock().lines() {
74         values.push(line.unwrap().parse::<T>()?)
75     }
76
77     Ok(values)
78 }