Skip to content
Snippets Groups Projects

members03

  • Clone with SSH
  • Clone with HTTPS
  • Embed
  • Share
    The snippet can be accessed without any authentication.
    Authored by raketenlurch
    Cargo.toml 207 B
    main.rs 3.38 KiB
    use pad::PadStr;
    use rand::Rng;
    use std::fs::File;
    use std::io::{BufRead, BufReader, Error};
    use std::process;
    
    const FILENAME: &str = "members-list.txt";
    
    #[derive(Debug, PartialEq, Eq, PartialOrd, Ord)]
    struct Member {
        name: String,
        emoji: String,
        membership_number: u16,
    }
    
    #[derive(Debug, PartialEq, Eq, PartialOrd, Ord)]
    struct UserInput {
        name: String,
        membership_number: u16,
    }
    
    fn main() -> Result<(), Error> {
        let file = File::open(FILENAME)?;
        let mut structs = read_file_to_members(file)?;
    
        println!("{} | membership number", "name".pad_to_width(10));
        println!("-----------|------------------------");
        structs.sort_by(|a, b| b.membership_number.cmp(&a.membership_number));
        structs.reverse();
        for line in structs.iter() {
            let name_string = line.name.pad_to_width(10);
            println!("{} | {}", name_string, line.membership_number);
        }
    
        println!("Add member: y/n");
    
        let yes_no = get_string();
    
        if yes_no == "n" {
            process::exit(0);
        } else if yes_no == "y" {
            println!("Enter the name of the new member!");
            let input = get_string();
    
            let mut new_member = fetch_input_and_add_to_members(input)?;
            let stripped_structs = strip_emoji_from_members(structs);
    
            for stripped_struct in stripped_structs {
                new_member.push(stripped_struct);
            }
    
            println!("{} | membership number", "name".pad_to_width(10));
            println!("-----------|------------------------");
    
            new_member.sort_by(|a, b| b.membership_number.cmp(&a.membership_number));
            new_member.reverse();
            for member in new_member {
                let name_string = member.name.pad_to_width(10);
                println!("{} | {}", name_string, member.membership_number);
            }
        }
    
        Ok(())
    }
    
    fn read_file_to_members(file: File) -> Result<Vec<Member>, Error> {
        let buffered = BufReader::new(file);
        let mut _line_read = String::new();
        let mut member_vec = Vec::new();
    
        for line in buffered.lines() {
            _line_read = match line {
                Ok(line) => line,
                Err(e) => {
                    return Err(e);
                }
            };
    
            let string_vec: Vec<&str> = _line_read.split_whitespace().collect();
            let member = Member {
                name: string_vec[0].to_string(),
                emoji: string_vec[1].to_string(),
                membership_number: string_vec[2].parse::<u16>().unwrap(),
            };
    
            member_vec.push(member);
        }
    
        Ok(member_vec)
    }
    
    fn fetch_input_and_add_to_members(user_input: String) -> Result<Vec<UserInput>, Error> {
        let mut input = Vec::new();
        let membership_number = rand::thread_rng().gen::<u16>();
    
        let new_member = UserInput {
            name: user_input,
            membership_number,
        };
    
        input.push(new_member);
    
        Ok(input)
    }
    
    fn strip_emoji_from_members(members: Vec<Member>) -> Vec<UserInput> {
        let mut stripped_member_vec = Vec::new();
        for member in members.iter() {
            let stripped_member = UserInput {
                name: member.name.clone(),
                membership_number: member.membership_number,
            };
    
            stripped_member_vec.push(stripped_member);
        }
    
        stripped_member_vec
    }
    
    fn get_string() -> String {
        let mut buffer = String::new();
        let stdin = std::io::stdin();
    
        stdin.read_line(&mut buffer).expect("BROKEN STDIN");
    
        let input = buffer.trim();
    
        input.parse().expect("Peng")
    }
    members-list.txt 140 B
    0% Loading or .
    You are about to add 0 people to the discussion. Proceed with caution.
    Finish editing this message first!
    Please register or to comment