use rand::seq::SliceRandom; fn parse_yaml(yaml: &String) -> Option { let content = &yaml_rust2::YamlLoader::load_from_str(yaml).ok()?[0]; let bracket_name = String::from(content["name"].as_str()?); let channel_id: u64 = content["channel_id"].as_str()?.parse::().ok()?; let role_id: u64 = content["role_id"].as_str()?.parse::().ok()?; let entries = content["entries"].as_vec()?; let mut entry_infos = Vec::new(); for entry in entries { let name = String::from(entry["name"].as_str()?); let description = entry["description"].as_str().and_then(|s| Some(String::from(s))); let emoji= entry["emoji"].as_str().and_then(|s| Some(String::from(s))); entry_infos.push(bracket_bot_v4::CreateBracketEntryInfo { name, description, emoji }); } entry_infos.shuffle(&mut rand::rng()); Some(bracket_bot_v4::CreateBracketInfo { bracket_name, channel_id, role_id, entries: entry_infos }) } #[tokio::main] async fn main() { let discord_conn_future = bracket_bot_v4::create_discord_conn(); let mut db_conn = bracket_bot_v4::create_db_conn(); let args: Vec = std::env::args().collect(); if args.len() != 2 { eprintln!("This must be run with one argument: the path to the bracket info YAML file (see readme.txt for format)."); std::process::exit(1); } let content_str = match std::fs::read_to_string(&args[1]) { Ok(s) => s, Err(e) => { eprintln!("Failed to read YAML file: {e}"); std::process::exit(1); } }; let create_info = match parse_yaml(&content_str) { Some(i) => i, None => { eprintln!("Failed to parse YAML file."); std::process::exit(1); } }; let discord_conn = discord_conn_future.await; let bracket_id = bracket_bot_v4::create_bracket(&mut db_conn, &discord_conn, &create_info).await; println!("Bracket ID: {}", bracket_id); }