steam_switcher/
lib.rs

1use std::io::Write;
2
3use anyhow::Result;
4use config::Config;
5
6use crate::steam::{kill_steam, launch_steam, modify_registry_file};
7
8pub mod config;
9pub mod steam;
10
11#[allow(dead_code)]
12fn main() -> Result<()> {
13    let mut config: Config = Config::load()?;
14    let res = show_menu(&mut config)?;
15
16    match res {
17        MenuSelector::Account(username) => {
18            println!("Selected steam user: {}", username);
19            println!("Killing all steam processes...");
20            kill_steam();
21            println!("Steam killed! Modyfing registry.vdf...");
22
23            modify_registry_file(username)?;
24
25            println!("Registry file modified! Starting steam...");
26            launch_steam(config.steam_command.as_str())?;
27        }
28        MenuSelector::AddNew => {
29            print_no_newline("Enter new username: ")?;
30
31            let mut username = String::new();
32            std::io::stdin().read_line(&mut username)?;
33
34            config.add_account(username.trim().to_string())?;
35            println!("Added account: {}!", username.trim());
36
37            main()?;
38        }
39        MenuSelector::Remove => {
40            print_no_newline("Enter number of account to remove: ")?;
41
42            let mut remove_index = String::new();
43            std::io::stdin().read_line(&mut remove_index)?;
44
45            let remove_index: usize = remove_index.trim().parse()?;
46
47            println!("Removed account: {}!", config.accounts[remove_index - 1]);
48            config.remove_account_index(remove_index - 1)?;
49
50            main()?;
51        }
52        _ => {}
53    }
54
55    Ok(())
56}
57
58fn print_no_newline(line: &str) -> Result<()> {
59    print!("{}", line);
60    std::io::stdout().flush()?;
61
62    Ok(())
63}
64
65enum MenuSelector {
66    Account(String),
67    Remove,
68    AddNew,
69    None,
70}
71
72fn show_menu(config: &mut Config) -> Result<MenuSelector> {
73    let accounts: &Vec<String> = &config.accounts;
74
75    for acc in 0..accounts.len() {
76        println!("{}. {}", acc + 1, accounts[acc]);
77    }
78
79    println!("\nn. Add new");
80    println!("d. Remove");
81    println!("q. Exit");
82
83    let mut menu_input = String::new();
84    std::io::stdin().read_line(&mut menu_input)?;
85
86    match menu_input.trim() {
87        "n" => {
88            return Ok(MenuSelector::AddNew);
89        }
90        "q" => {
91            return Ok(MenuSelector::None);
92        }
93        "d" => {
94            return Ok(MenuSelector::Remove);
95        }
96        _ => {}
97    }
98
99    let account_index: usize = menu_input.trim().parse()?;
100    if account_index - 1 < accounts.len() {
101        return Ok(MenuSelector::Account(
102            accounts[account_index - 1].to_string(),
103        ));
104    }
105
106    return Ok(MenuSelector::None);
107}